使用大括号向引用类型强制转换是否符合C++标准?
GCC与Clang在引用类型列表初始化中的行为差异
void foo(int t) { using T = int&; // Clang和GCC均编译通过: T r1(t); T r2{t}; (void)T(t); // Clang编译通过,GCC报错: (void)T{t}; }
GCC编译最后一行时抛出错误:
cannot bind non-const lvalue reference of type 'T' {aka 'int&'} to an rvalue of type 'int'
但t是明确的左值,该错误信息存在误导性,怀疑GCC内部错误创建了t的临时副本。
正确行为分析
根据C++标准,当用列表初始化语法初始化非const左值引用时,若列表仅包含单个左值元素,引用应直接绑定到该左值。(void)T{t};的语义与(void)T(t);完全一致,都是将int&类型引用绑定到左值t。因此:
- Clang的处理符合C++标准
- GCC的报错属于编译器实现bug,错误地将列表中的左值
t当作右值处理并尝试创建临时对象,违反了引用绑定规则
内容的提问来源于stack exchange,提问作者Mikhail
相关产品推荐
相关产品推荐

