Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在将constexpr添加到语言后,将变量声明为const是多余的吗?_C++_C++11_Constants_Constexpr - Fatal编程技术网

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
变量的值。在回答中添加了一点免责声明。