다음 작은 코드 내에서 :
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
}
지정된 줄이 컴파일 오류를 생성하지 않는 이유는 무엇입니까? 내 캐스트 연산자는 lvalue에 의해 규정 &
되었으므로 객체가 rvalue 인이 두 줄에 대해 호출되지 않아야한다고 생각했습니다.
이 코드가 문제없이 컴파일되는 이유를 아십니까? const
캐스트 연산자 선언에서 제거하면 이 두 줄이 오류가 발생 한다는 것을 알았습니다 . 그러나 const 한정 이이 ref 한정 메서드 호출에 어떤 영향을 미치는지 잘 모르겠습니다.
rvalue는 lvalue-reference에도 바인딩 될 수 있기 const
때문입니다. (비상 수에 대한 lvalue 참조에 바인딩 될 수 없습니다.)
해결 방법으로 의도에 따라 const
언급 한대로 한정자를 제거 하거나 rvalue-reference 한정자 (및 const
필요한 경우 @HolyBlackCat이 제안한 한정자)로 오버로딩을 추가 하고 delete
명시 적으로 표시 할 수 있습니다 . 예
class B {
public:
operator A() const & {
return A{};
}
operator A() && = delete;
};
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다