14

你会换

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

有了这个?

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

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

另一方面,正如constexpr所暗示的那样const,您可能会争辩说,总是更喜欢限制性更强的形式更一致,即使在没有任何影响的微不足道的情况下也是如此?

(我知道当右边的表达式允许更复杂时情况完全改变。所以为了澄清,问题只关注表达式是固定整数的最简单的情况。)

4

2 回答 2

13

我认为您所说的constconstexpr在语义上相同”的声明应该被修改:它们都声明了其值不能改变的对象,而且constexpr还要求初始化表达式在编译时是可计算的。

现在,如果右侧的表达式不能在编译时计算,那么使用constexpr是不可能的。另一方面,只要初始值设定项是文字,您就可以使用constexpr,但请注意变量的语义是什么:您的常量变量是否真的表示其值应该在编译时可计算的东西?

在 SW 维护/进化光学系统中,您可能会随时间改变初始化变量的方式:今天初始化程序是文字,明天可能是更复杂的表达式。

无论您现在以何种方式为其分配值,您是否认为它i需要由文字以外的任何其他东西进行初始化,并且初始化表达式可能在编译时无法计算?如果是这种情况,那么只需创建您的变量const,即使您当前正在使用文字对其进行初始化;否则,做它constexpr

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

于 2013-02-26T00:01:16.653 回答
0

在这种情况下,您不必替换const为,constexpr

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

如果你有一个像这样的常量变量,

const int three = one + two;

你最好把它定义为constexpr

constexpr int three = one + two;

以确保在编译期间将计算三个。

我知道有人会争辩说,现代编译器会进行优化,甚至只用const.

我只是举个例子来说明 constexpr 的用法,可能计算复杂,编译器无法优化。

于 2021-05-13T09:12:32.153 回答