作者:靠谱的留一手_267 | 来源:互联网 | 2022-12-06 19:48
在这个问题1的启发下,我创建了以下代码:
struct X {
X(int) {}
};
struct Y {
operator X() { return X{1}; }
operator int() { return 1; }
};
int main() {
X x(Y{});
}
带有错误消息的现场演示.
这段代码:
如果启用C++ 11/14,所有GCC和Clang版本(我已尝试过)会引发歧义错误,
如果启用了C++ 17,则会在某些GCC和Clang版本中引发歧义错误(例如,GCC 8.2,GCC 6.3,Clang 5),
如果启用C++ 17,则编译一些GCC和Clang版本(例如,GCC 7.3,Clang 6).
歧义源于可能的转换:
Y
→ X
,
Y
→ int
和int
→ X
,
因为编译器不知道X
它应该使用哪个构造函数(复制/移动或转换int
).
我想知道为什么编译器行为存在这种差异,以及标准是否说该代码应该触发错误.
1请注意,这不是重复的.在相关问题中,OP询问了如何消除歧义.我问为什么不同编译器的行为不同.