[C++] move assignment operator const argument

kataich

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

$ cat a.cc
class A {
public:
A{};
~A{};

A(A&& other) = default;
A& operator=(const A&& other) = default;
};

int main
{
A a;

return 0;
}


$ g++ -std=c++11 a.cc
a.cc:7:6: error: defaulted declaration ‘A& A::operator=(const A&&)’
A& operator=(const A&& other) = default;
^
a.cc:7:6: error: does not match expected signature ‘A& A::operator=(A&&)’

Не могли бы вы, пожалуйста, пояснить, в чём тут суть?
Почему default и const rvalue отказываются дружить.

apl13

А что такое const rvalue?
Или, например, что такое const A&&?

bleyman

В сторонней программе баг, не имеет смысла такое объявление.

kataich

А что такое const rvalue?
Я не могу ответить на этот вопрос, потому что не понимаю.
Здесь говорится, что оператор может принимать на вход параметр типа const T&&. Возможно, кто-то сможет пояснить, что тут имеется в виду?
Я хотел бы разобраться с вопросом. Вероятно, это прольёт свет на то, почему стороннее приложение ведёт себя таким образом.

jakal222

error: does not match expected signature ‘A& A::operator=(A&&)’
похоже, что компилятору не нравится const в аргументе оператора присваивания. Он не понимает, почему, собственно, этот самый аргумент ( rvalue ) должен быть const
Убрав const, ты ничего не потеряешь
P.S: давно плюсы не видел

kataich

Вот что думают другие компиляторы
msvс:

Error 1 error C2610: 'A::A(A &&)' : is not a special member function which can be defaulted
Error 2 error C2610: 'A &A::operator =(const A &&)' : is not a special member function which can be defaulted

Тут пишут, что
Visual Studio does not support defaulted move constructors or move-assignment operators as the C++11 standard mandates.
То есть Visual Studio вообще откажется реализовать default функциональность. Константность rvalue тут ни при чём.
clang:
a.cc:7:6: error: the parameter for an explicitly-defaulted move assignment operator may not be const
A& operator=(const A&& other) = default;
Вопрос, кстати, остаётся. Какой случай имеют в виду cppreference, когда подразумевают const rvalue входным аргуметом.

Dimon89

default означает, что реализация должна использовать стандартный конструктор, сгенерированный компилятором. Компилятор не генерирует конструктор, принимающий на вход const rvalue.
visual studio 2012 вообще не понимает default, на ней проверять бесполезно.

PooH

если почитать про смысл move-семантики, то станет понятно, что const rvalue ref это просто оксюморон.
синтаксически он есть, но смысла в нем 0.
поэтому можно сделать вывод, что кодогенератор содержит в себе ошибку, и все эти (const A&&) надо заменить на (A&&)
Оставить комментарий
Имя или ник:
Комментарий: