假设我们有一个带有2个xvalue操作数的三元运算符。
struct A {
A() { std::cout<<"A ctor"<<std::endl; }
~A() { std::cout<<"A dtor"<<std::endl; }
A(A const&) { std::cout<<"A copy ctor"<<std::endl; }
A(A&&) { std::cout<<"A move ctor"<<std::endl; }
void foo() & { std::cout<<"A&.foo()"<<std::endl; }
void foo() const& { std::cout<<"A const&.foo()"<<std::endl; }
void foo() && { std::cout<<"A&&.foo()"<<std::endl; }
void foo() const&& { std::cout<<"A const&&.foo()"<<std::endl; }
};
int main()
{
A a;
A a2;
(true? static_cast<A&&>(a) : static_cast<A&&>(a2)).foo();
return 0;
}
根据cppreference条件运算符
4)如果E2和E3是相同类型和相同值的glvalues 类别,则结果具有相同的类型和值类别,并且是 如果E2和E3中的至少一个是位字段,则为位字段。
结果也应该是A &&,并且不希望有复制或移动构造函数。我对么?
但是gcc,clang和Visual Studio对此给出了不同的结果。
gcc:A&.foo()
c语:A&&.foo()
VS:
A move ctor
A&&.foo()
如果我们将两种操作数类型都转换为A const&&
,则gcc将为A const&.foo()
,clang将为A const&&.foo()
,VS将为A const&&.foo()
,且其副本ctor称为。
c是正确的吗?谢谢!