草庐IT

c++ - 如何让 CMake 基于 GCC 版本通过 std=c++14/c++1y 或 c++17/c++1z?

GCC4.x不接受C++14代码的--std=c++14开关-它需要--std=c++1y代替。更高版本采用--std=c++1z但(可能)不是--std=c++17尚未设置(在2016年编写).也许C++11也有类似的问题。CMake是否有一些工具(可能作为一个模块)来根据GCC版本传递正确的开关? 最佳答案 当想要指定特定的C++版本时,推荐使用CMake3.1及更高版本执行此操作的方法是使用CXX_STANDARD、CXX_STANDARD_REQUIRED和CXX_EXTENSIONS目标属性,或它们的变量等效项以指定目标默

c++ - 如何让 CMake 基于 GCC 版本通过 std=c++14/c++1y 或 c++17/c++1z?

GCC4.x不接受C++14代码的--std=c++14开关-它需要--std=c++1y代替。更高版本采用--std=c++1z但(可能)不是--std=c++17尚未设置(在2016年编写).也许C++11也有类似的问题。CMake是否有一些工具(可能作为一个模块)来根据GCC版本传递正确的开关? 最佳答案 当想要指定特定的C++版本时,推荐使用CMake3.1及更高版本执行此操作的方法是使用CXX_STANDARD、CXX_STANDARD_REQUIRED和CXX_EXTENSIONS目标属性,或它们的变量等效项以指定目标默

c++ - C++ 17中的静态constexpr和静态内联变量有什么区别?

在C++17中,我们得到内联变量。它们的用途之一是在类中定义常量字段。那么这两个常量定义有什么区别:classMyClass{staticconstexprintmyFirstVar=10;staticconstinlineintmySecondVar=100;};当然constexpr使myFirstVar隐式内联。这里有什么更好的选择,使用constexpr或inline?注意:当你不需要constness时,inline会更容易。使用constexpr你没有那个选择。 最佳答案 您不必在声明时为mySecondVar指定初始化

c++ - C++ 17中的静态constexpr和静态内联变量有什么区别?

在C++17中,我们得到内联变量。它们的用途之一是在类中定义常量字段。那么这两个常量定义有什么区别:classMyClass{staticconstexprintmyFirstVar=10;staticconstinlineintmySecondVar=100;};当然constexpr使myFirstVar隐式内联。这里有什么更好的选择,使用constexpr或inline?注意:当你不需要constness时,inline会更容易。使用constexpr你没有那个选择。 最佳答案 您不必在声明时为mySecondVar指定初始化

c++ - 聚合初始化的 C++17 扩展是否使大括号初始化变得危险?

似乎普遍认为braceinitializationshouldbepreferred超过其他形式的初始化,但是自从引入C++17extensiontoaggregateinitialization似乎存在意外转换的风险。考虑以下代码:structB{inti;};structD:B{charj;};structE:B{floatk;};voidf(constD&d){Ee1=d;//errorC2440:'initializing':cannotconvertfrom'D'to'E'Ee2(d);//errorC2440:'initializing':cannotconvertfrom

c++ - 聚合初始化的 C++17 扩展是否使大括号初始化变得危险?

似乎普遍认为braceinitializationshouldbepreferred超过其他形式的初始化,但是自从引入C++17extensiontoaggregateinitialization似乎存在意外转换的风险。考虑以下代码:structB{inti;};structD:B{charj;};structE:B{floatk;};voidf(constD&d){Ee1=d;//errorC2440:'initializing':cannotconvertfrom'D'to'E'Ee2(d);//errorC2440:'initializing':cannotconvertfrom

c++ - 为什么 C++17 结构化绑定(bind)不使用 {}?

我找到了*C++结构化绑定(bind)的原始提案here.它提出了一种轻松绑定(bind)多个返回值的方法,即:auto{a,b}=minmax(data);但是现在看到大家都指向了C++17/C++1z的提案语法auto[a,b]=minmax(data);既然我学会了“列表是写成{就像,这个}”,那么有一个新的列表语法吗?为什么?这里的大括号有什么问题? 最佳答案 西类牙和美国的国家机构提议改回{}语法,因为(P0488R0):The“structuredbindings”proposaloriginallyusedbraces

c++ - 为什么 C++17 结构化绑定(bind)不使用 {}?

我找到了*C++结构化绑定(bind)的原始提案here.它提出了一种轻松绑定(bind)多个返回值的方法,即:auto{a,b}=minmax(data);但是现在看到大家都指向了C++17/C++1z的提案语法auto[a,b]=minmax(data);既然我学会了“列表是写成{就像,这个}”,那么有一个新的列表语法吗?为什么?这里的大括号有什么问题? 最佳答案 西类牙和美国的国家机构提议改回{}语法,因为(P0488R0):The“structuredbindings”proposaloriginallyusedbraces

c++ - C++17 中 protected 构造函数的规则改变了吗?

我有这个测试用例:structA{protected:A(){}};structB:A{};structC:A{C(){}};structD:A{D()=default;};intmain(){(void)B{};(void)C{};(void)D{};}gcc和clang都在C++11和C++14模式下编译它。两者都在C++17模式下失败:$clang++-std=c++17main.cppmain.cpp:7:10:error:baseclass'A'hasprotecteddefaultconstructor(void)B{};^main.cpp:1:22:note:declar

c++ - C++17 中 protected 构造函数的规则改变了吗?

我有这个测试用例:structA{protected:A(){}};structB:A{};structC:A{C(){}};structD:A{D()=default;};intmain(){(void)B{};(void)C{};(void)D{};}gcc和clang都在C++11和C++14模式下编译它。两者都在C++17模式下失败:$clang++-std=c++17main.cppmain.cpp:7:10:error:baseclass'A'hasprotecteddefaultconstructor(void)B{};^main.cpp:1:22:note:declar