【发布时间】:2017-09-18 00:21:36
【问题描述】:
是否允许将非常量引用声明为constexpr?示例代码:
int x = 1;
constexpr int& r = x;
gcc 和 clang 都接受了这一点(我尝试了两者的当前和过去版本,回到 C++11,都接受了它)。但是我认为它不应该被接受,因为 C++14 [dcl.constexpr/9] 说:
如果在引用声明中使用了 constexpr 说明符,则每个完整的 出现在其初始化程序中的表达式应为常量表达式
并且x 不是常量表达式。
[dcl.constexpr] 的最新 C++17 草案中的语言发生了变化,甚至不再明确提及 constexpr 引用,我无法理解它试图表达的内容他们。
【问题讨论】:
-
谁说
x不是常量表达式? -
"
x不是核心常量表达式" {{citation needed}} -
@T.C. [expr.const]/2 "
e是一个核心常量表达式,除非e的评估将评估以下之一:[...] 左值到右值转换,除非它应用于 [cases此代码不匹配]" -
x被分配了一个字面值,这还不足以让编译器知道它是编译时已知的吗? -
如何评估表达式
x需要对其进行左值到右值的转换?
标签: c++ reference c++14 language-lawyer constexpr