将const分配给constexpr变量

时间:2015-07-12 09:17:49

标签: c++ c++11 language-lawyer constexpr

我尝试运行基于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变量,那就是错误。

但是我的节目没有任何投诉地编译。

我错过了什么吗?

1 个答案:

答案 0 :(得分:8)

<强> Ammendment

celtschk在问题下面的评论中提出了一个很好的观点。也就是说,您没有在代码中分配任何内容。你只是在初始化。从const分配到constexpr确实是一个错误。所以,如果那是你的书所说的,那就不是不正确了。但是,这将是一个奇怪的要点,因为在另一个方向(从constexprconst)进行分配也是一个错误。无论如何,答案的其余部分假设当你说“分配”时,你的意思是“初始化”。

修订完毕

你的书不正确(假设你没有错误地解释它所说的内容)。用常量表达式初始化的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会这样做)