Clang拒绝但GCC接受new C[]{1},哪个编译器符合C++标准?
哪个编译器的行为符合C++标准?
你的代码符合C++11及以后的标准,GCC和MSVC的行为正确,Clang的报错属于实现问题。
原因分析
根据C++标准中动态数组初始化的规则:
- 使用
new T[]{初始化列表}语法时,数组大小会自动由初始化列表的元素数量推导(这里列表仅含1,因此数组大小为1)。 - 数组的每个元素通过列表初始化构造:对于你的
C类,C{1}会直接调用C(int)构造函数完成初始化,这完全符合标准要求。
Clang的错误提示显示它错误地认为需要无参构造函数,这是旧版本Clang未正确实现“省略数组大小的动态数组列表初始化”特性导致的缺陷,新版本Clang已修复该问题,可正常编译这段代码。
等价验证代码
你的代码逻辑等价于显式指定数组大小的写法,该写法在所有合规编译器中都能正常编译:
C *ptr{new C[1]{1}};
内容的提问来源于stack exchange,提问作者user20562802
相关产品推荐
相关产品推荐

