【问题标题】:Assign a const to a constexpr variable将 const 分配给 constexpr 变量
【发布时间】:2015-07-12 09:17:48
【问题描述】:

我尝试运行一个基于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 变量,则会出错。

但是我的程序编译没有任何抱怨。

我错过了什么吗?

【问题讨论】:

  • 表达式constexpr int val1 = i;i 的值赋给val1
  • 您没有分配给constexpr 变量,而是在初始化它们。您可以写成与constexpr int val1{ i }; 相同的内容——使用该符号,您会立即看到不涉及任何分配。

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


【解决方案1】:

修正

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

修订结束


您的书不正确(假设您没有错误地解释它所说的内容)。用常量表达式初始化的 const 积分本身就是一个常量表达式。所以i是一个常量表达式,可以用来进一步初始化其他常量表达式。

引用标准,5.19/2

条件表达式 e 是核心常量表达式,除非 e 的评估,遵循抽象机 (1.9) 的规则, 将评估以下表达式之一:
...
— 左值到右值的转换 (4.1),除非它应用于:
...
— 整数或枚举类型的非易失性左值,它引用具有先前初始化的非易失性 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 会这样做)

【讨论】:

  • @user3337714:这个答案没有提到积分。
  • 我明白了。我只提到是因为它显示了相同的示例代码和理解。 :)
猜你喜欢
  • 2015-05-04
  • 2012-11-01
  • 2017-01-12
  • 2021-11-01
  • 2018-03-16
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多