constexpr 对非常量对象的引用

M.M*_*M.M 5 c++ reference language-lawyer constexpr c++14

是否允许将非常量引用声明为constexpr?示例代码:

int x = 1;
constexpr int& r = x;
Run Code Online (Sandbox Code Playgroud)

gcc 和 clang 都接受了这一点(我尝试了两者的几个当前和过去版本,回到 C++11,并且都接受了)。但是我认为它不应该被接受,因为 C++14 [dcl.constexpr/9] 说:

如果在引用声明中使用 constexpr 说明符,则其初始值设定项中出现的每个完整表达式都应为常量表达式

并且x不是常量表达式。

[dcl.constexpr] 的最新 C++17 草案中的语言发生了变化,甚至不再constexpr明确提及引用,我无法弄清楚它试图对它们说些什么。

T.C*_*.C. 4

假设x具有静态存储持续时间,则左值表达式x是一个完全有效的常量表达式。

如果您在需要纯右值的上下文中使用x,这会导致对其应用左值到右值转换,那么TO_RVALUE(x)由于显而易见的原因,生成的纯右值表达式(称为它)将不是常量表达式。但在引用绑定的情况下,就没有这样的转换。