是否允许将非const引用声明为constexpr
?示例代码:
int x = 1;
constexpr int& r = x;
这被gcc和clang所接受(我尝试了两个当前版本和过去版本,回到C ++ 11,并且都接受了它)。但是我认为它不应该被接受,因为C ++ 14 [dcl.constexpr / 9]说:
如果在参考声明中使用constexpr说明符,则每个完整 - 出现在其初始化程序中的表达式应为常量表达式
和x
不是常量表达式。
[dcl.constexpr]的最新C ++ 17草案中的语言发生了变化,甚至没有明确提及constexpr
引用,我无法理解它所尝试的内容。说说他们。
答案 0 :(得分:4)
假设x
具有静态存储持续时间,则左值表达式x
是完全有效的常量表达式。
如果在需要prvalue的上下文中使用x
,这会导致将lvalue-to-rvalue转换应用于它,那么生成的prvalue表达式 - 称之为TO_RVALUE(x)
- 不会由于显而易见的原因,他们是一个不变的但是在引用绑定的情况下,没有这样的转换。