constexpr对非const对象的引用

时间:2017-04-21 06:14:47

标签: c++ reference c++14 language-lawyer constexpr

是否允许将非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引用,我无法理解它所尝试的内容。说说他们。

1 个答案:

答案 0 :(得分:4)

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

如果在需要prvalue的上下文中使用x,这会导致将lvalue-to-rvalue转换应用于它,那么生成的prvalue表达式 - 称之为TO_RVALUE(x) - 不会由于显而易见的原因,他们是一个不变的但是在引用绑定的情况下,没有这样的转换。