将const赋值给constexpr变量

Assign a const to a constexpr variable

本文关键字:constexpr 变量 赋值 const      更新时间:2023-10-16

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

但是我的程序没有任何报错。

我错过了什么吗?


修改

celtschk在问题下面的评论中说得很好。也就是说,您没有对代码中的任何内容进行赋值。你只是在初始化。从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

还要注意,这个只适用于整型和enum类型。不是,例如float和double。

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

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