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

use*_*670 13 c++ decltype language-lawyer auto c++17

该标准规定了这一点

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

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

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

int main()
{
    const decltype(auto) sz_text{"test"};
}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 10

要回答这个问题,我们需要引用前一段,它指出了什么T.在这种情况下,[dcl.type.auto.deduct]/2表示(强调我的):

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

  • 对于使用包含占位符类型的类型声明的变量,T是变量的声明类型, e是初始值设定项.如果初始化是直接列表初始化,则初始化器应该是一个braced-init-list,只包含一个赋值表达式,e是赋值表达式;

在这种情况下,T整个声明的类型sz_text,cv限定符和所有.你引用的段落很清楚,如果它包含decltype(auto)占位符,它必须是那个,而不是更多.

所以一个GCC错误.还有一个报道过的.