Подтвердить что ты не робот

Тернарное выражение, назначенное rvalue, не использует оператор перемещения

Кто-нибудь знает, почему следующий код не компилируется:

[hidden]$ g++ -v |& tail -n 1
gcc version 4.8.1 20130603 (Red Hat 4.8.1-1) (GCC)
[hidden]$ cat c.cpp
struct X {
  X() = default;
  X(const X&) = default;
  X(X&&) = default;
  X& operator=(const X&) = delete;
  X& operator=(X&&) = default;
};

void f(bool t) {
  X a, b;
  (t ? a : b) = X();
}

[hidden]$ g++ -std=c++11 -c c.cpp
c.cpp: In function ‘void f(bool)’:
c.cpp:11:15: error: use of deleted function ‘X& X::operator=(const X&)’
   (t ? a : b) = X();
               ^
c.cpp:5:6: error: declared here
   X& operator=(const X&) = delete;
      ^
c.cpp:11:15: error: use of deleted function ‘X& X::operator=(const X&)’
   (t ? a : b) = X();
               ^
c.cpp:5:6: error: declared here
   X& operator=(const X&) = delete;
      ^

Разве это не X() rvalue, поэтому оператор назначения перемещения должен быть вызван в этом случае? В каком разделе в стандарте С++ 11 говорится о трехмерном выражении случая, присвоенном rvalue?

Примечание: тройное выражение lvalue в этом случае, потому что, если я изменяю = delete на = default, он компилируется.

4b9b3361

Ответ 1

Это ошибка в компиляторе, см. Разрешение перегрузки Bogus для оператора присваивания при назначении условному, оно все еще терпит неудачу в gcc 4.9.

Проблема заключается не в тройном операторе, а в том, что разрешение перегрузки заканчивается при неправильном операторе присваивания.