C++ 通过不明确的转换运算符进行引用绑定 #包括 使用名称空间std; 结构CL2 { CL2(){} CL2(constcl2&){} }; CL2-CL2; 结构CL1 { CL1(){} 运算符CL2&({cout

C++ 通过不明确的转换运算符进行引用绑定 #包括 使用名称空间std; 结构CL2 { CL2(){} CL2(constcl2&){} }; CL2-CL2; 结构CL1 { CL1(){} 运算符CL2&({cout,c++,visual-studio,c++11,c++14,copy-initialization,C++,Visual Studio,C++11,C++14,Copy Initialization,)由于两个转换运算符具有相同的签名,因此一个运算符优于另一个运算符的唯一方法是应用[over.match.best]/(1.4) -上下文是通过用户定义的转换进行的初始化(参见8.5, 13.3.1.5和13.3.1.6)以及从F1返回类型到目的地类型(即 实体(正在初始化)是比 从返回类型F2到 目的地类型 …或(1.5): -上下文是一个通过转换初始化的函数,用于直接 函数类型引用的引用绑定(13.3.1.6),[…] 显然,两者都不适用,因此存在歧义。消除歧义的一种可能方法: #inclu

)由于两个转换运算符具有相同的签名,因此一个运算符优于另一个运算符的唯一方法是应用[over.match.best]/(1.4)

-上下文是通过用户定义的转换进行的初始化(参见8.5, 13.3.1.5和13.3.1.6)以及从
F1
返回类型到目的地类型(即 实体(正在初始化)是比 从返回类型
F2
到 目的地类型

…或(1.5):

-上下文是一个通过转换初始化的函数,用于直接 函数类型引用的引用绑定(13.3.1.6),[…]

显然,两者都不适用,因此存在歧义。消除歧义的一种可能方法:

#include <iostream>
using namespace std;

struct CL2
{
    CL2(){}
    CL2(const CL2&){}
};

CL2 cl2;

struct CL1
{
    CL1(){}
    operator CL2&(){cout<<"operator CL2&"; return cl2;}
    operator const CL2&(){cout<<"operator const CL2&"; return cl2;}
};

CL1 cl1;

int main()
{
    CL1 cl1;
    CL2 cl2 (cl1);
}

;这里,根据[over.ics.rank]/(3.2.6),隐式对象参数的前一个重载的初始标准转换序列更好,这是由[over.match.best]/(1.3)决定的.

奇怪的是,Visual Studio确实编译了您的代码。但IntelliSense抱怨声明第二个对象。据我所知,您的问题不是您所想的问题。编译器不知道要调用哪个转换运算符函数,因为您不能根据返回类型重载,但可以根据函数的缺点重载请尝试
操作符const CL2&()const{cout谢谢,但我不明白为什么它们有相同的签名(考虑到“const”)?为什么在[over.match.copy]中写了“引用X”,而不是“引用cv X”(X被推断为“CL2”,但不是“const CL2”)?@user3514538第一个标准转换序列在第二个标准转换序列之前考虑。即,如果存在
常量,则这是主要的。@user3514538[over.match.copy]不适用,因为它处理复制初始化(而您的示例显示直接初始化)。此外,
X
是任意的,因此已包含任何简历资格。
operator CL2&();
operator const CL2&() const;