You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用大括号向引用类型强制转换是否符合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:31:08