受this question 1 的启发,我创建了以下代码:
struct X {
X(int) {}
};
struct Y {
operator X() { return X{1}; }
operator int() { return 1; }
};
int main() {
X x(Y{});
}
Live demo with error messages。
此代码:
如果启用了C ++ 11/14,则所有GCC和Clang版本都会引发歧义错误(我已经尝试过),
会在某些GCC和Clang版本中引发歧义错误,
将使用某些GCC和Clang版本进行编译。
含糊不清源自可能的转换:
Y
→X
,Y
→int
和int
→X
,因为编译器不知道应使用哪个X
构造函数(从int
复制/移动或转换)。
我想知道为什么编译器的行为存在这种差异,以及标准是否规定该代码应触发错误。
1 请注意,这不是重复项。在链接的问题中,OP询问了如何消除歧义。我问为什么不同的编译器的行为不同。