C++17类型转换规则变更:MSVC与GCC/Clang谁符合标准?
C++函数式转换的歧义问题分析
初始可编译代码
以下代码在GCC、Clang和MSVC中均可正常编译运行:
struct B; struct A { operator B() const; }; struct B {}; void f() { (void)B(A{}); }
修改后出现编译差异的代码
当为A添加另一转换操作符,同时为B添加对应构造函数后,MSVC编译失败,代码如下:
struct B; struct A { operator B() const; operator int() const; }; struct B { B(int); }; void f() { (void)B(A{}); }
MSVC编译错误信息
<source>(13): error C2440: '<function-style-cast>': cannot convert from 'A' to 'B' <source>(13): note: 'B::B': ambiguous call to overloaded function <source>(10): note: could be 'B::B(B &&)' <source>(10): note: or 'B::B(const B &)' <source>(9): note: or 'B::B(int)' <source>(13): note: while trying to match the argument list '(A)'
标准符合性疑问
请问GCC和Clang与MSVC谁的行为符合C++标准?
该问题发现于C20场景中,在C17/20/23中表现一致,但在C11/14中,GCC会报类似错误,Clang报错信息有所不同,推测这与C17的规则变更有关。
C++14下GCC错误信息
<source>:13:16: error: call of overloaded 'B(A)' is ambiguous 13 | (void)B(A{}); | ^ <source>:9:5: note: candidate: 'B::B(int)' 9 | B(int); | ^ <source>:8:8: note: candidate: 'constexpr B::B(const B&)' 8 | struct B { | ^ <source>:8:8: note: candidate: 'constexpr B::B(B&&)'
C++14下Clang错误信息
<source>:13:11: error: ambiguous conversion for functional-style cast from 'A' to 'B' 13 | (void)B(A{}); | ^~~~~~ <source>:8:8: note: candidate constructor (the implicit copy constructor) 8 | struct B { | ^ <source>:8:8: note: candidate constructor (the implicit move constructor) <source>:9:5: note: candidate constructor 9 | B(int); | ^
内容的提问来源于Stack Exchange,提问作者Benjamin Buch
相关产品推荐
相关产品推荐

