2015-07-12 71 views
1

我试图运行基于constexpr的程序。将const指定给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

表达'constexpr INT VAL1 = I;'分配i'的'价值'val1' – user3337714

+1

你不是分配给'constexpr'变量,你正在初始化它们。你可以写同样的'constexpr int val1 {i};' - 用这个符号,你立即看到没有赋值。 – celtschk

回答

8

Ammendment

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


你的书是不正确的

末(假设你是不是正确复述他们所说)。用常量表达式初始化的const积分本身就是一个常量表达式。所以i是一个常量表达式,可以用来进一步初始化其他常量表达式。

答曰标准,5.19/2

甲条件表达式e是一个核心常量表达式除非e的 评价,下列的抽象机(1.9), 将评估中的一个的规则下面的表达式:
...
- 左值到右值转换(4.1),除非它被施加到:
...
- 积分或枚举类型的非易失性glvalue引用到具有前面的初始化的非易失性常量对象补肾中药,具有常量表达式
初始化...

但是请注意,这是不符合一个常量表达式初始化一个常量,当然不是一个常量表达式:

int a = 10; 
const int b = a; 
constexpr int c = b; // error 

还要注意这只有适用于整数和枚举类型。不是,例如漂浮和双打。

const float a = 3.14; 
constexpr float b = a; // error 

尽管一些编译器可能允许(我相信MSVC一样)

+0

根据这个[答案](http://stackoverflow.com/a/13347355/3337714) – user3337714

+3

@ user3337714:这个答案没有提到积分。 –

+0

我明白了。我只提到它,因为它显示了相同的示例代码和理解。 :) – user3337714