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

时间:2018-08-23 07:43:17

标签: c++ gcc clang language-lawyer implicit-conversion

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版本都会引发歧义错误(我已经尝试过),

  • 如果启用了C ++ 17(例如,GCC 8.2,GCC 6.3,Clang 5),
  • 会在某些GCC和Clang版本中引发歧义错误,

  • 如果启用了C ++ 17(例如,GCC 7.3,Clang 6),
  • 将使用某些GCC和Clang版本进行编译。

含糊不清源自可能的转换:

  1. YX
  2. YintintX

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

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


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

0 个答案:

没有答案