我是否应该尽可能在C++ 11中将'const int'替换为'constexpr int'?

Phi*_*ßen 11 c++ const constexpr c++11

你会替换吗?

const int one = 1;
const int two = 2;
Run Code Online (Sandbox Code Playgroud)

有了这个?

constexpr int one = 1;
constexpr int two = 2;
Run Code Online (Sandbox Code Playgroud)

我的理解是正确的,两个块在语义上是相同的,并且它目前只是一个品味的问题?

另一方面,正如constexpr所暗示的那样const,你可以争辩说,总是更喜欢更具限制性的形式更为一致,即使是在无关紧要的微不足道的情况下也是如此?

(我理解当右侧的表达式允许更复杂时,情况会完全改变.因此,为了澄清,问题只关注表达式是固定整数的最简单的情况.)

And*_*owl 13

我觉得你的声明说,constconstexpr" 具有相同的语义 "应修改为:它们都宣称对象,它们的值不能改变,但constexpr也需要初始化表达式是在编译时间计算.

现在,如果在编译时无法计算右侧的表达式,则使用constexpr是不可能的.另一方面,只要初始化器是一个文字,你可以使用constexpr,但要考虑变量的语义是什么:你的常量变量真的代表其值应该在编译时可计算的东西吗?

在SW维护/演化光学系统中,您可能会改变初始化变量的方式:今天初始化器是文字,明天可能是更复杂的表达式.

不管你现在的样子分配一个值,现在,你认为i永远都需要通过别的比文字进行初始化,并且初始化表达式可能无法在编译时间计算的?如果是这种情况,那么只需创建变量const,即使您当前正在使用文字初始化它; 否则,成功constexpr.

换句话说,选择最能表达变量语义的限定符.

  • @rici:有道理,但我认为当你评论中的问题答案为"否"时,OP主要关注的是案例.当答案是"是"时,肯定变量应该是`constexpr`.但是如果初始化程序不是严格需要是一个`constexpr`表达式,而恰好恰好是一个呢?这是我试图回答的问题. (3认同)
  • 我会把最后的建议转到头上:问问自己:"这个名字需要在编译时解决吗?" (例如,我在某处使用它作为数组大小或枚举值.)如果是这样,请使用`constexpr`,以便没有人试图以导致名称使用失败的方式更改它. (2认同)
  • @rici:问题是,如果他甚至*想*声明`const int i = ...`然后将其用作数组大小,他就不会被允许,因为编译器会发出错误.虽然"*使用constexpr始终指示后者为代码阅读器*提供了有用的信息",但你不能选择这样做.我相信问题就在于你有选择的情况. (2认同)
  • @PhilippClaßen你的经验法则是正确的; "根据这个规则,我会在我的例子中选择constexpr" - 在你的例子中,我们没有根据你猜测你可能希望客户端代码做什么,尽管表面上看,"两个= 2"是一个它会疯狂的身份改变.更明确地说,你想要避免`constexpr`的关键场景是当你现在对一个值进行硬编码但是可以看到以后可能需要使用命令行或配置文件中的值,尽管有很多变化和其他scenerios .... (2认同)