声明一个非const引用作为constexpr
,是否允许?示例代码:
int x = 1;
constexpr int& r = x;
这个代码在gcc和clang上是可以通过的(我在当前和过去几个版本中尝试过,直到C++11),但我认为它不应该被接受,因为C++14的[dcl.constexpr/9]规定如下:
如果在引用声明中使用constexpr说明符,则出现在其初始化器中的每个完整表达式都应该是常量表达式。
而x不是常量表达式。
最新的C++17草案中[dcl.constexpr]的语言已经改变,甚至不再明确提及constexpr参考了,我无法理解它对它们想要表达什么。
x
不是一个常量表达式? - T.C.x
不是核心常量表达式” {{需要引用}} - T.C.x
被赋予了一个字面值,这难道不足以让编译器知道它是编译时已知的吗? - asimesx
如何需要对其进行 lvalue-to-rvalue 转换? - T.C.x
将被 /2.9 覆盖,我假设它的意思是说,如果 id-expression 表示一个对象,并且该对象使用常量表达式初始化,则该对象是常量表达式。对我来说不清楚这句话是指“(变量)或(引用类型的数据成员)”还是“(变量或数据成员)的引用类型”。 - M.M