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错误.还有一个报道过的.