Sat*_*ish 1 c++ language-lawyer constexpr c++11
我试图运行一个基于的程序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;
}
Run Code Online (Sandbox Code Playgroud)
在我所遵循的书中,提到如果将const分配给constexpr变量,那就是错误.
但我的程序编译没有任何投诉.
我错过了什么吗?
Ammendment
celtschk在问题下面的评论中提出了一个很好的观点.也就是说,您没有在代码中分配任何内容.你只是在初始化.从a分配const到a constexpr确实是一个错误.所以,如果那是你的书所说的,那就不是不正确了.然而,这将是一个奇怪的要点,因为在另一个方向(从a constexpr到a const)的分配也是一个错误.无论如何,答案的其余部分假设当你说"分配"时,你的意思是"初始化".
修正案结束
你的书是不正确的(假设你没有错误地解释它所说的).用常量表达式初始化的const积分本身就是一个常量表达式.这i是一个常量表达式,可用于进一步初始化其他常量表达式.
标准,5.19/2
条件表达式e是核心常量表达式,除非按照抽象机器(1.9)的规则评估e将评估以下表达式之一:
...
- 左值到右值的转换(4.1)除非它适用于:
...
- 一个非整数或枚举类型的非易失性glvalue,它引用一个带有前面初始化的非易失性const对象,用一个常量表达式初始化
...
但是,请注意,未使用常量表达式初始化的const当然不是常量表达式:
int a = 10;
const int b = a;
constexpr int c = b; // error
Run Code Online (Sandbox Code Playgroud)
另请注意,这仅适用于整数和枚举类型.不是,例如花车和双打.
const float a = 3.14;
constexpr float b = a; // error
Run Code Online (Sandbox Code Playgroud)
虽然有些编译器可能允许(我相信MSVC会这样做)
| 归档时间: |
|
| 查看次数: |
414 次 |
| 最近记录: |