Iva*_*van 8 c++ gcc clang decltype auto
我尝试使用不同的选项在GCC 8.2下编译这个C++代码,它总是成功,不产生警告和输出true:
int && a = 123;
decltype(auto) b = a;
std::cout << std::boolalpha << std::is_same<decltype(b), int&>::value;
Run Code Online (Sandbox Code Playgroud)
同时,相同的代码不会在Clang中编译,如果我对标准的理解是正确的,那就是符合标准的行为.
cppreference decltype:
如果参数是未加密码的id-expression或未加括号的类成员访问表达式,则decltype将生成此表达式命名的实体的类型.
cppreference decltype(auto):
如果声明的变量类型是decltype(auto),则将关键字auto替换为其初始化程序的表达式(或表达式列表),并使用decltype规则推导出实际类型.
因此,decltype(auto)应该屈服int&&.因为它a是一个左值,它不应该绑定b,导致编译错误.
那么海湾合作委员会是否不符合标准或者是否有我遗漏的东西?
你的推理是合理的.我想我看到海湾合作委员会正在绊倒.
对于措辞decltype(auto)说,auto被替换为表达在初始化.根据GCC,这意味着你的代码不等同于
decltype(a) b = a;
Run Code Online (Sandbox Code Playgroud)
但它相当于
decltype((a)) b = a;
Run Code Online (Sandbox Code Playgroud)
但这是错误的.初始值设定项是 "未加特征化的id-expression",因此[dcl.type.simple]中针对未加密码的id-expression的规则应该正常应用.b需要推断的类型为int&&.
随着@Aconcagua能够挖掘,这是一个已知的GCC错误.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           200 次  |  
        
|   最近记录:  |