隐式转换和编译器的不同行为

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).

歧义源于可能的转换:

  1. YX,
  2. YintintX,

因为编译器不知道X它应该使用哪个构造函数(复制/移动或转换int).

我想知道为什么编译器行为存在这种差异,以及标准是否说该代码应该触发错误.


1请注意,这不是重复的.在相关问题中,OP询问了如何消除歧义.我问为什么不同编译器的行为不同.