将const分配给constexpr变量

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变量,那就是错误.

但我的程序编译没有任何投诉.

我错过了什么吗?

Ben*_*ley 8


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会这样做)

  • @ user3337714:那个答案没有提到积分. (3认同)