C++ 为什么调用此ref限定的用户定义转换?

C++ 为什么调用此ref限定的用户定义转换?,c++,c++11,C++,C++11,在以下小代码中: 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 }

在以下小代码中:

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
}
A类{
};
B类{
公众:
运算符A()常量&{
返回一个{};
}
};
void foo(施工图A&A){
}
int main()
{
B B;
a1=b;

a2=B{};//,因为右值也可以绑定到常量的左值引用(它们不能绑定到非常量的左值引用)

作为解决方法,根据您的意图,您可以按照您所说的删除
const
限定符,或者添加带有右值引用限定符的重载(以及@HolyBlackCat建议的
const
限定符,如有必要),并显式将其标记为
delete

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

您不熟悉绑定到rValst的const LValk引用的老C++属性吗?它比RValk引用和REF更古老。qualifiers@StoryTeller-UnslanderMonica是的,我知道这个属性。但是我认为调用操作符应该在绑定之后的一步决定。这就是为什么我不能确切地理解调用操作符的原因。无论如何,我的错误。应该是
运算符A()const&&=delete;
,否则它与
const
rvalues一起工作。有什么方法可以防止第一种情况(
aa2=B{};
)发生,但允许在第二种情况下发生(
foo(B{};
)?我这样问是因为
B{}
在第一种情况下被销毁,但直到第二个示例中
foo
返回后才会被销毁。@Afshin我认为不是。它们都执行复制初始化。而临时变量在完整表达式后被销毁,即
之后;
@songyuanyao感谢您提供的信息。我认为与其使用cast,不如添加隐式表达式构造函数,它接受类
A
常量B&
,并且只在类B中保留
运算符A()&&&=delete;
。有趣的是,构造函数不会被调用,因为类B中删除了右值强制转换运算符。你知道原因吗?@Afshin在重载解析中可能一个比另一个好;我不确定。