C++ 在将constexpr添加到语言后,将变量声明为const是多余的吗?
由于关键字C++ 在将constexpr添加到语言后,将变量声明为const是多余的吗?,c++,c++11,constants,constexpr,C++,C++11,Constants,Constexpr,由于关键字constepr意味着const,并且它也可以在编译时计算,这是否意味着现在将变量声明为const没有意义,我们应该始终将它们声明为constepr 它也可以在编译时计算,这是否意味着现在将变量声明为const没有意义,我们应该始终将它们声明为constepr 并且必须在编译时计算(忽略) 因此,您不能声明constexpr一个使用运行时已知值初始化的变量。但是您可以声明它const 例如:您不能声明barconstexpr int foo; std::cin >> fo
constepr
意味着const
,并且它也可以在编译时计算,这是否意味着现在将变量声明为const
没有意义,我们应该始终将它们声明为constepr
它也可以在编译时计算,这是否意味着现在将变量声明为const
没有意义,我们应该始终将它们声明为constepr
并且必须在编译时计算(忽略)
因此,您不能声明constexpr
一个使用运行时已知值初始化的变量。但是您可以声明它const
例如:您不能声明bar
constexpr
int foo;
std::cin >> foo;
constexpr int bar = foo; // compilation error
但是您可以声明它const
int foo;
std::cin >> foo;
const int bar = foo; // compile
添加到@max66应答:
constexpr
只能替换顶级const
。它永远不能替换指向常量或常量引用的指针。因此,有时constexpr
和const
可以在同一声明中使用。例如
const char* const s = "Hello";
可替换为:
constexpr const char* s = "Hello";
不,一点也不
constexpr
表示“常量表达式”,如[可能]静态已知,如“[可能]编译时已知”
const
表示“初始化后无法更改”
这些是完全不同的概念。例如,可以使用运行时值初始化const
对象
constepr
可以暗示const
,但const
肯定不暗示constepr
(我认为<代码> CONTXPRPR <代码>是一个非常混乱的名称,由于这个原因)
现在考虑<代码> const char * const s= GETValueFasOnHothe();<代码>“但const肯定并不意味着constexpr”-除了涉及整数类型和枚举的恼人的小传统花絮。这里可能有点像薛定谔的constexpr。constexpr可以暗示const-你的意思是,在某些情况下,constexpr变量可以用另一个值重新赋值?我觉得康斯特普瓦总是const@Johy我的意思是constexpr
事物可以(通常/总是?)是“不可变的”,这就是const
的意思。并且必须在编译时计算。-我认为它仍然可以,因为最终编译器自己决定,并且没有人给出100%的保证,所有constexpr表达式都将在编译时进行计算time@Johy-你描述的是假设规则。是:如果不改变程序的行为,编译器也可以在运行时计算constepr
变量的值。在回答中添加了一点免责声明。