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在重载解析中可能一个比另一个好;我不确定。