我尝试运行基于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变量,那就是错误。
但是我的节目没有任何投诉地编译。
我错过了什么吗?
答案 0 :(得分:8)
<强> Ammendment 强>
celtschk在问题下面的评论中提出了一个很好的观点。也就是说,您没有在代码中分配任何内容。你只是在初始化。从const
分配到constexpr
确实是一个错误。所以,如果那是你的书所说的,那就不是不正确了。但是,这将是一个奇怪的要点,因为在另一个方向(从constexpr
到const
)进行分配也是一个错误。无论如何,答案的其余部分假设当你说“分配”时,你的意思是“初始化”。
修订完毕
你的书不正确(假设你没有错误地解释它所说的内容)。用常量表达式初始化的const积分本身就是一个常量表达式。所以i
是一个常量表达式,可以用来进一步初始化其他常量表达式。
标准,5.19 / 2
条件表达式e是核心常量表达式,除非 评估e,遵循抽象机的规则(1.9), 将评估以下表达式之一:
...
- 左值 - 右值转换(4.1),除非它适用于:
...
- 一个非整数或枚举类型的非易失性glvalue,它引用具有前面初始化的非易失性const对象,用常量表达式初始化
...
但是,请注意,未使用常量表达式初始化的const当然不是常量表达式:
int a = 10;
const int b = a;
constexpr int c = b; // error
另请注意,此仅适用于整数和枚举类型。不是,例如花车和双打。
const float a = 3.14;
constexpr float b = a; // error
虽然有些编译器可能允许(我相信MSVC会这样做)