标准规定
如果占位符是
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"};
}
答案 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