是否允许在decltype(自动)变量上使用cv限定符?

时间:2018-01-15 12:23:28

标签: c++ language-lawyer auto decltype c++17

标准规定

  

如果占位符是decltype(auto)类型说明符,则T应仅为占位符。

     

decltype(auto)*x7d = &i; //错误,声明的类型不是普通decltype(auto)

目前尚不清楚是否仍允许使用cv-qualifiers。如果他们被允许将是有道理的。编译器似乎在这个问题上存在分歧。以下代码is accepted by g++rejected by clang++,vc ++似乎根本不支持decltype(auto)个变量:

int main()
{
    const decltype(auto) sz_text{"test"};
}

1 个答案:

答案 0 :(得分:10)

要回答这个问题,我们需要引用上一段,其中指出T是什么。在这种情况下,[dcl.type.auto.deduct]/2说(强调我的):

  

包含占位符类型和相应类型的类型T.   初始化器e,确定如下:

     
      
  • 对于使用声明包含占位符类型的类型声明的变量,T是变量的声明类型,e是   初始化。如果初始化是直接列表初始化,那么   初始化程序应该是一个仅包含单个的braced-init-list   assignment-expression和e是赋值表达式;
  •   

在这种情况下,T整个声明的sz_text类型,cv-qualifiers等等。你引用的段落非常清楚,如果它包含decltype(auto)作为占位符,它必须是那个,而不是更多。

这是一个GCC错误。 And an already reported one