在迈克·艾萨克森 (https://youtu.be/-ctgSbEfRxU?t=2907) 的“探索 C++17 及以后”演讲中,有一个关于写作的问题:
const constexpr ....
与单一常量。 Mike 说在 C++11 中 constexpr 意味着 const 而在 C++14 中则不是。
是真的吗?
我试图为此找到证明,但我找不到。
我不是在问 const 和 constexpr 之间的区别(以及许多其他问题),而是在询问两个版本的 C++ 标准中 constexpr 的区别。
考虑这段代码:
struct T {
int x;
constexpr void set(int y) {
x = y;
}
};
constexpr T t = { 42 };
int main() {
t.set(0);
return 0;
}
它应该在 C++14 中编译,但在 C++11 中给出错误,就好像成员函数 set
被声明为 const
。这是因为 constexpr
在 C++11 中隐含了 const
,而在标准的后续版本中不再如此。
constexpr
关键字保证对象不会在运行时动态初始化。对于函数,它保证函数可以在编译时求值。在 C++11 中,这与“存储在只读内存中”相混淆,但这很快被识别为错误。
此外,在 C++14 中,constexpr
函数和成员的功能更加强大。例如,它们可以修改非 const
对象,因此它们不能隐式为 const
。