具有xvalue操作数的三元运算符

时间:2018-11-19 11:59:49

标签: c++ c++11 c++14 c++17 value-categories

假设我们有一个带有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是正确的吗?谢谢!

0 个答案:

没有答案