草庐IT

c++ - C++17 中的歧义错误(模板模板参数和默认参数问题)

我的代码使用c++14和c++17标准标志被g++以不同方式解释:#include#includetemplatevoidfunc(conststd::vector&v){std::coutclassVector>voidfunc(constVector&v){std::coutv;func(v);}intmain(){f();return0;}当我尝试使用命令编译此代码时g++-std=c++14-Wall-pedanticmain.cpp一切正常。但是当我试图用命令编译这段代码时g++-std=c++17-Wall-pedanticmain.cpp我收到此错误:main.cpp:I

c++ - 如何启用/标准 :c++17 in VS2017 with CMake

我正在尝试使用CMake将/std:c++17编译器标志添加到VS2017。到目前为止,我使用的是“现代”跨平台方式:set(CMAKE_CXX_STANDARD14)set(CMAKE_CXX_STANDARD_REQUIREDON)set(CMAKE_CXX_EXTENSIONSOFF)#-std=c++11insteadof-std=gnu++11set(MY_CXX_COMPILE_FEATUREScxx_generic_lambdascxx_range_forcxx_strong_enums)add_library(mylibINTERFACE)target_compile_

c++ - __cplusplus 对于 C++17 的值是多少?

我们正在尝试在C++17及其changetostd::uncaught_exception下测试一些代码。.我似乎无法让GCC提供__cplusplus的值:$/opt/local/bin/g++-std=c++17-dM-E-还有:$/opt/local/bin/g++--versiong++-mp-6(MacPortsgcc66.1.0_0)6.1.0Copyright(C)2016FreeSoftwareFoundation,Inc.使用C++17时__cplusplus的值是多少? 最佳答案 tl;dr:对于C++17,__

c++ - C++17 会支持更简单的基于范围的 For 循环吗?

从C++11开始,我们可以这样写:vectorv{1,2,3,4};for(autox:v){cout根据EssentialsofModernC++Style,下面的代码很快也会在C++中合法化:vectorv{1,2,3,4};for(x:v){cout此功能会在C++17或C++20中提供吗? 最佳答案 没有。这被委员会杀死了morethantwoyearsago,主要是因为担心阴影可能导致混淆:std::vectorv={1,2,3,4};intx=0;for(x:v){}//thisdeclaresanewx,anddoes

c++ - 什么是合约(为 C++17 提议的)?

我在ThoughtsaboutC++17中阅读了有关契约(Contract)的信息由B.Stroustrup撰写,并协助进行了一次小型演示,讨论了它们,但我不确定我是否真的理解它们。所以我有一些询问,如果可以用一些例子来说明它们:契约(Contract)只是经典assert()的更好替代吗?,它们应该一起使用吗?对于软件开发人员来说,哪些契约(Contract)真的很简单?契约(Contract)会对我们处理异常的方式产生影响吗?如果是,我们应该如何使用异常(exception)和契约(Contract)?使用合约是否意味着执行时的开销?我们是否可以在发布代码上停用它们?来自propo

c++ - GCC 对 C++17 的支持情况如何?

Clang有一个nicepage描述项目状态w.r.t.C++1z/C++17特性支持(和C++11和C++14是同一页)。g++有apageregardingC++14features,但我找不到任何关于C++17/C++1z的信息。是否正在处理但只是没有出现在网络上?对于5.0版? 最佳答案 截至今天,gcc对C++1z语言的支持跟踪在:https://gcc.gnu.org/projects/cxx1z.html.关于libstdc++的C++1z状态,见https://gcc.gnu.org/onlinedocs/libst

c++ - 在 C++17 中修改 constexpr 函数中的全局变量

在C++17中,是否允许在constexpr函数中修改全局变量?#includeintglobal=0;constexprintFoo(boolarg){if(arg){return1;}returnglobal++;}intmain(){std::cout我不希望你能做到,但clang6允许它:https://godbolt.org/g/UB8iK2但是,GCC没有:https://godbolt.org/g/ykAJMA哪个编译器是正确的? 最佳答案 Whichcompileriscorrect?Clang是对的。根据dcl.c

c++ - 使用 C++17 是否可以检测结构/类是否有任何基础?

我需要一个类型特征,如果给定类型派生自任何东西,则该特征为真,否则为假。例如:templatestructis_inherit//...logicofinheritancedetection;templatevoidAppLogic(){ifconstexpr(is_inherit::value){puts("Thasbase");//...}else{puts("Tdoesn'thavebase");//...}}structA{};structC{};structB:C{};intmain(){AppLogic();//print:Tdoesn'thavebaseAppLogic(

c++ - 为什么在 c++17 中不推荐使用 std::allocator 的构造和销毁函数?

c++17规范弃用了std::allocator对象的construct和destroy成员。工作组提供了弃用其他成员函数的理由here,在“弃用std::allocator的冗余成员”标题下。但是,他们没有具体提及为什么不推荐使用这两个成员,也没有具体提及替换该功能的建议。我假设这意味着使用std::allocator_traits::construct代替。我对在某些情况下是否仍然需要实现construct感到有点困惑,尽管因为thiscommentaboutstd::allocator_traits::constructBecausethisfunctionprovidesthe

c++ - 此代码是否应该无法在 C++17 中编译?

我正在更新一个项目以使用C++17,并发现一些遵循此模式的代码在最新版本的clang上导致编译错误的情况:#includestructvis:publicboost::static_visitor{voidoperator()(int)const{}};intmain(){boost::variantv=0;boost::apply_visitor(vis{},v);}Usingclangv8.0inC++17mode,thisfailswiththefollowingerror::11:30:error:temporaryoftype'boost::static_visitor'ha