首页 > 解决方案 > 为什么调用此 ref 限定的用户定义转换?

问题描述

在以下小代码中:

class A {    
};

class B {
    public:
    operator A() const & {
        return A{};
    }
};

void foo(const A& a) {

}

int main()
{
    B b;
    A a1 = b;
    A a2 = B{}; //<--- here
    foo(b);
    foo(B{}); //<--- here
}

为什么指定的行不会产生编译错误?我的强制转换运算符是由 限定的左值&,所以我认为不应该为这两行调用对象是右值。

知道为什么这段代码编译没有任何问题吗?我注意到如果我const从强制转换运算符声明中删除,这两行会出错。但我不确定 const 限定如何影响此 ref 限定方法的调用。

标签: c++c++11

解决方案


因为右值也可以绑定到左值引用const。(它们不能被绑定到非常量的左值引用。)

作为解决方法,根据您的意图,您可以const按照您所说的删除限定符,或者使用 rvalue-reference 限定符添加重载(const如果需要,还可以按照@HolyBlackCat 的建议添加限定符)并将其标记为delete显式。例如

class B {
    public:
    operator A() const & {
        return A{};
    }
    operator A() && = delete;
};

推荐阅读