Dan*_*ica 7 c++ gcc clang language-lawyer implicit-conversion
在这个问题1的启发下,我创建了以下代码:
struct X {
X(int) {}
};
struct Y {
operator X() { return X{1}; }
operator int() { return 1; }
};
int main() {
X x(Y{});
}
Run Code Online (Sandbox Code Playgroud)
这段代码:
如果启用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询问了如何消除歧义.我问为什么不同编译器的行为不同.