将const赋值给constexpr变量
Assign a const to a constexpr variable
我尝试运行一个基于constexpr
的程序。
代码:
#include <iostream>
using namespace std;
int main()
{
const int i = 10;
constexpr int j = 10;
constexpr int val1 = i;
constexpr int val2 = j;
return 0;
}
在我后面的书中提到,如果将const赋值给constexpr变量,这是一个错误。
但是我的程序没有任何报错。
我错过了什么吗?
修改
celtschk在问题下面的评论中说得很好。也就是说,您没有对代码中的任何内容进行赋值。你只是在初始化。从const
分配到constexpr
确实是一个错误。所以如果你书上是这么说的,那就不是错的。然而,这将是一个奇怪的观点,因为在另一个方向上分配(从constexpr
到const
)也是一个错误。不管怎样,剩下的答案是在假设当你说"赋值"时,你的意思是"初始化"。
修改结束
你的书是不正确的(假设你没有错误地解释它所说的)。用常量表达式初始化的const积分本身也是常量表达式。因此,i
是一个常量表达式,可以用来进一步初始化其他常量表达式。
符合标准,5.19/2
但是,请注意,没有使用常量表达式初始化的const当然不是常量表达式:条件表达式e是核心常量表达式,除非对e求值,遵循抽象机(1.9)的规则,将计算下列表达式之一:
…
-左值到右值的转换(4.1),除非它应用于:
…
非易失性的整型或枚举类型的全局值,它指向一个非易失性的const对象,该对象在初始化之前使用常量表达式
进行初始化。…
int a = 10;
const int b = a;
constexpr int c = b; // error
还要注意,这个只适用于整型和enum类型。不是,例如float和double。
const float a = 3.14;
constexpr float b = a; // error
尽管有些编译器可能允许(我相信MSVC允许)
相关文章:
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- constexpr函数中的静态constexpr变量
- 有时可以在 constexpr 上下文中使用非 constexpr 变量?
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 是否使用静态 constexpr 变量 odr?
- 是否可以将变体的索引作为 constexpr 变量获取?
- 非 constexpr 变量模板的开销是否为零?
- Constexpr变量不是编译时值
- 为什么非成员静态 constexpr 变量不是隐式内联的?
- 使用 constinit 变量初始化 constexpr 变量
- 这是通过初始化 constexpr 变量来标记编译错误的合理跳转
- "static initialization order fiasco"是 constexpr 变量的问题吗?
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- is_constant_evaluated() 应该产生 constexpr 变量吗?
- 是否都是隐式内联的 constexpr 变量
- 为全局constexpr变量生成唯一值
- 错误!Constexpr变量必须通过常数表达式constexpr初始化
- 为什么我不能使用 msvc 在模板类中声明静态 constexpr 变量?
- 如果Constexpr - clang vs.GCC,则非constexpr变量
- Clang 在编译时不会计算非 constexpr 变量的 constexpr 函数的值