C++ 我是否应该始终替换';常量int';与';constexpr int';在C++;11.只要可能?

C++ 我是否应该始终替换';常量int';与';constexpr int';在C++;11.只要可能?,c++,c++11,constants,constexpr,C++,C++11,Constants,Constexpr,你会更换吗 const int one = 1; const int two = 2; 用这个 constexpr int one = 1; constexpr int two = 2; 我的理解正确吗?这两个块在语义上是相同的,目前只是一个口味的问题 另一方面,正如constexpr所暗示的const,您可能会认为,总是选择限制性更强的形式更为一致,即使是在无关紧要的情况下也是如此 (我知道当右边的表达式变得更复杂时,情况会完全改变。因此为了澄清,问题只集中在表达式为固定整数的最简单情况。

你会更换吗

const int one = 1;
const int two = 2;
用这个

constexpr int one = 1;
constexpr int two = 2;
我的理解正确吗?这两个块在语义上是相同的,目前只是一个口味的问题

另一方面,正如
constexpr
所暗示的
const
,您可能会认为,总是选择限制性更强的形式更为一致,即使是在无关紧要的情况下也是如此


(我知道当右边的表达式变得更复杂时,情况会完全改变。因此为了澄清,问题只集中在表达式为固定整数的最简单情况。)

我认为你的说法是
const
constepr
“语义相同”应该修改:它们都声明值不能更改的对象,但是
constexpr
还要求初始值设定项表达式在编译时是可计算的

现在,如果不能在编译时计算右侧的表达式,那么使用
constepr
是不可能的。另一方面,只要初始值设定项是文本,就可以使用
constepr
,但要考虑变量的语义:常量变量真的代表了什么吗ng谁的值应该在编译时可计算

在软件维护/演化过程中,您可能会在一段时间内更改初始化变量的方式:今天,初始值设定项是一个文本,明天它可能是一个更复杂的表达式

无论您现在以何种方式给它赋值,您是否认为
i
需要用文本以外的任何东西进行初始化,并且初始化表达式在编译时可能无法计算?如果是这样,那么即使您当前正在初始化它,也只需将变量
const
使用文本;否则,将其设置为
constexpr


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

在这种情况下,您不必将
const
替换为c
onstepr

const int one = 1;
const int two = 2;
如果有这样一个常量变量

const int three = one + two;
您最好将其定义为
constepr

constepr int three = one + two;
确保在编译期间计算三个

我知道有人会说,现代编译器会进行优化,甚至只需使用
const
就可以进行计算


我只是举一个使用constepr的例子,计算可能很复杂,编译器无法对其进行优化。

我唯一能想到的是,如果您指定类似于API的东西,您可能会决定使用
const int
来存储常量表达式,因为该属性在将来的修订版中可能无法保存。我会把它转过来最后一点建议:问问自己:“这个名称需要在编译时解析吗?”(例如,我在某处将它用作数组大小或枚举值。)如果是这样,请使用
constexpr
,这样就不会有人试图以可能导致名称使用失败的方式对其进行更改。@rici:这是有道理的,但我认为OP主要关注的是当您的注释中的问题的答案为“否”时的情况。当答案为“是”时“,当然变量应该设置为
constexpr
。但是,如果初始值设定项不严格要求是
constexpr
表达式,而现在正好是一个表达式,该怎么办?这是我试图回答的问题。这很公平,但在我看来,很难回答“有一天我需要用比文字更复杂的东西来初始化吗?”,并且很容易回答“我需要在编译时被知道吗?”一致使用
constexpr
指示后者为代码读取器提供有用的信息;用
const
来表示你想象一个可能与事实相反的未来,不是那么多。@rici:问题是,如果他甚至想声明
const int i=…
并将其用作数组大小,他就是不被允许的,因为编译器会发出一个错误。虽然“始终使用constexpr来指示后者为代码读取器提供了有用的信息”是事实,但您不能选择其他方式。我相信问题是关于那些你确实有选择余地的情况。@PhilippClaßen你的经验法则是正确的;“根据这条规则,我会在我的示例中选择constexpr”-在您的示例中,我们没有根据来猜测您可能希望客户端代码做什么,尽管表面上看
two=2
是一个标识,更改它将是疯狂的。更明确地说,您希望避免
constexpr
的一个关键场景是,您现在正在硬编码一个值,但可以看到以后可能需要使用命令行或配置文件中的值,尽管有许多变体和其他场景。。。。