C++ GCC中结构体使用初始化列表直接赋值报错问题
GCC C++17下
s = {}赋值失败的问题分析 代码示例
enum class X { A, B }; struct Y { X x = X::A; }; struct S { Y unit[2] = {}; }; int main() { S s; s = {}; }
编译表现差异
- GCC 12.3/13.2 +
-std=c++17:编译失败 - GCC +
-std=c++11:编译通过 - Clang +
-std=c++17:编译通过
GCC错误输出
<source>:20:10: error: no match for 'operator=' (operand types are 'S' and '<brace-enclosed initializer list>') 20 | s = {}; | ^ <source>:13:8: note: candidate: 'constexpr S& S::operator=(const S&)' 13 | struct S | ^ <source>:13:8: note: no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const S&' <source>:13:8: note: candidate: 'constexpr S& S::operator=(S&&)' 13 | struct S | ^ <source>:13:8: note: no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'S&&'
结论:这是GCC的Bug
根据C++标准,s = {}属于合法的直接列表初始化赋值形式——编译器应当将{}隐式转换为S类型临时对象,再调用默认生成的拷贝/移动赋值运算符。
C17的聚合类列表初始化规则并未禁止该用法,Clang的行为符合标准,而GCC在C17模式下的编译错误属于实现缺陷,该问题属于GCC已知Bug,相关修复已在后续版本中处理。
内容的提问来源于stack exchange,提问作者Afshin
相关产品推荐
相关产品推荐

