Тернарный оператор с операндами xvalue

Скажем, у нас есть троичный оператор с 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;
}

Согласно условному оператору

4) Если E2 и E3 являются glvalues ​​одного типа и того же значения
категория, то результат имеет тот же тип и категорию значения, и
битовое поле, если хотя бы одно из E2 и E3 является битовым полем.

Результат должен быть также&& и никаких конструкторов копирования или перемещения не ожидается. Я прав?

Но gcc, clang и Visual Studio дают разные результаты по этому вопросу.

НКА: A&.foo()

лязг: A&&.foo()

VS:

A move ctor
A&&.foo()

Если мы приведем оба типа операндов к A const&&гкк будет A const&.foo()лязг будет A const&&.foo()VS будет A const&&.foo() с копией ctor называется.

Является ли Clang правильным на этом? Спасибо!

4

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]