2013-02-25 78 views
11

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

const int one = 1; 
const int two = 2; 

这个?

constexpr int one = 1; 
constexpr int two = 2; 

我的理解是正确的,这两个块具有相同的语义,它目前的味道只是一个事?

在另一方面,作为constexpr意味着const,你可以认为它是比较一致的总是倾向于更严格的形式,即使在平凡的情况下它不会有所作为?

(据我所知,当右侧的表达式被允许更复杂时,情况完全改变,因此为了澄清,该问题仅关注表达式是固定整数的最简单情况。)

+1

我能想到的唯一的事情是,如果你指定像一个API的东西,你可能会决定使用'常量int'存储一个常量表达式作为属性可能不会在将来的版本举行。 – Pubby 2013-02-26 00:00:53

回答

13

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

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

在软件维护/演化光学,很可能你会改变你整个时间初始化变量的方式:今天初始化为文字,明天它可能是一个更复杂的表达式。

不管你分配一个值现在顺便说一下,你认为i将永远需要被其它的东西比文字进行初始化,并且初始化表达式可能无法在编译时间计算的?如果是这种情况,那么只需制作变量const即使您正在使用文字初始化它,否则,使其成为constexpr

换句话说,选择最能表达你的变量的语义预选赛。

+2

我会把最后的建议放在头上:问问你自己:“这个名字是否需要在编译时解决?” (例如,我使用它作为一个数组大小或枚举值的某个地方。)如果是这样,使用'constexpr'使得没有人被试探来改变它的方式,这将导致使用的名称的失败。 – rici 2013-02-26 00:20:53

+3

@rici:有道理,但我认为OP主要关注评论中问题的答案为“否”的情况。当答案为“是”时,肯定该变量应该是“constexpr”。但是如果初始化器不严格地需要一个'constexpr'表达式,现在恰好是一个呢?这是我试图回答的问题。 – 2013-02-26 00:24:33

+0

不够公平,但它似乎对我非常难以回答的问题是“可能'i'有一天需要用的东西比文字更复杂的初始化?“,并且很容易回答”编译时需要知道'我'的问题吗?“使用'constexpr'始终如一地指示后者向代码读取器提供有用的信息;使用'const'指示您想象一个可能的事实上的未来,不是那么多 – rici 2013-02-26 00:27:44