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

标签 c++ c++11 copy-constructor implicit-conversion language-lawyer

#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);
}

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

User-defined conversions are applied only where they are unambiguous

在这种情况下似乎存在歧义。谁能解释一下矛盾?

我原以为上面的代码不会编译。我也很确定几年前 Scott Meyers 写了关于这个特定示例的文章,并说它无法编译。我错过了什么?

最佳答案

因为 X 构造函数需要一个 const 参数,所以它更喜欢运算符。如果您在 X 构造函数中删除 const,那么编译器会提示歧义。如果有多个具有引用参数的函数,则首选具有最宽松的 const 限定的函数。

一个很好的答案here

关于C++11:传递值参数初始化中转换构造函数和转换函数之间的歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9661078/

相关文章:

c++ - std::ref 和 swap 函数似乎不能很好地协同工作

c++ - 更新 QTreeWidget 的数据

c++在复制构造函数中使用const?

c++ - 未调用模板类复制构造函数

c++ - 为什么 std::bitset 实例中的 std::swap of Bits 不起作用?

c++ - 如果使用constexpr,是否可以删除控制流语句?

c++ - C++ 模板中的模板参数

c++ - 关于 >>、<< 运算符 & cin 和 cout 对象组合的问题

c++ - 确定参数类型

c++ - 了解 C++ 中的复制构造函数