C++ 11:在传值参数的初始化中转换构造函数和转换函数之间的歧义?

And*_*zos 6 c++ copy-constructor language-lawyer implicit-conversion c++11

#include <iostream>
using namespace std;

struct Y;

struct X
{
    X(const Y&) { cout << "converting constructor" << endl; }
};

struct Y
{
    operator X() { cout << "conversion function" << endl; }
};

void f(X x) {}

int main()
{
    Y y;
    f(y);
}
Run Code Online (Sandbox Code Playgroud)

在上面,转换函数由我的编译器(gcc 4.6.1)优先于转换构造函数,但是在标准中它声明:

用户定义的转换仅在明确无误的情况下应用

在这种情况下似乎存在歧义.任何人都可以解释这个矛盾吗?

我原本以为不能编译.几年前我也非常肯定Scott Meyers写了这个具体的例子,并说它不会编译.我错过了什么?

per*_*eal 5

因为X构造函数需要一个const参数,所以它更喜欢运算符.如果删除constX构造函数,那么编译器会抱怨模糊性.如果有多个具有参考参数的函数,则优先选择具有最宽松const限定的函数.

这里的答案很好