Size: a a a

2020 April 16

NP

Nikita Provotorov in pro.cxx
Mikhail Demchenko
Я скорее за конструктор вида: T(const T&&) const noexcept в данном случае, он бы мог означать продолжение жизни объекта, но под другим именем
const Obj a1;
Obj a2 = std::move(a1);

Что в таком случае должно быть?
источник

MD

Mikhail Demchenko in pro.cxx
Nikita Provotorov
const Obj a1;
Obj a2 = std::move(a1);

Что в таком случае должно быть?
Не скомпилится, а вот если const Obj a1; const Obj a2 = std::move(a1) - то хотелось бы
источник

NP

Nikita Provotorov in pro.cxx
Mikhail Demchenko
Не скомпилится, а вот если const Obj a1; const Obj a2 = std::move(a1) - то хотелось бы
Получается что у нас есть два объекта которые на самом деле не два а один?
источник

MD

Mikhail Demchenko in pro.cxx
Фактически, после второй строки обращаться к a1 более нельзя, но вот обращаться к a2 за контентом a1 - можно
источник

MD

Mikhail Demchenko in pro.cxx
Рассматривай это всё в контексте generic выражений, где тип T = const Obj
источник

MD

Mikhail Demchenko in pro.cxx
Я вот именно с этим столкнулся
источник

NP

Nikita Provotorov in pro.cxx
Mikhail Demchenko
Фактически, после второй строки обращаться к a1 более нельзя, но вот обращаться к a2 за контентом a1 - можно
Ну это называется разрушающее перемещение или как то так, в плюсах такого нет, есть вроде бы в расте
источник

MD

Mikhail Demchenko in pro.cxx
Nikita Provotorov
Ну это называется разрушающее перемещение или как то так, в плюсах такого нет, есть вроде бы в расте
Не совсем оно, a1 не разрушается, а становится не доступным для использования, но живым (не помню где это сказано, где-то около объяснения move семантики)
источник

NP

Nikita Provotorov in pro.cxx
Mikhail Demchenko
Не совсем оно, a1 не разрушается, а становится не доступным для использования, но живым (не помню где это сказано, где-то около объяснения move семантики)
Ну a1 и в расте не разрушается, просто также не доступно для использования
источник

MD

Mikhail Demchenko in pro.cxx
Идея в том, что последовательность move операций в константных объектах делает их деструкторы тривиальными в плоть до последнего, где должен вызваться непосредственный деструктор класса
источник

MD

Mikhail Demchenko in pro.cxx
Т.е.
const T t0;
const T t1 = std::move(t0);
const T t2 = std::move(t1);
- вызывается только 1 ~T() если не определён  T(const T&&)
источник

ПК

Побитый Кирпич in pro.cxx
Mikhail Demchenko
Не совсем оно, a1 не разрушается, а становится не доступным для использования, но живым (не помню где это сказано, где-то около объяснения move семантики)
Нет там такого. Есть только, что после мува объекты из std находятся в valid unspecified состоянии. Слово valid позволяет нам продолжать с ними работать.

Пользовательский объект самостоятельно определяет гарантии на своё moved out состояние. Но проще всё же считать, что у всех как в std - valid unspecified
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
А мне вот кажется, что все логично.
Rvalue reference указывает на объект который уже не нужен и скоро помрет и позволяет пользователю делать что угодно с этим объектом (главное, после всех манипуляций оставить его в “разрушаемом” состоянии), обычно это подразумевает вытягивание всего внутреннего состояния в другой объект.
Но что по такой идеологии можно сделать с const rvalue reference? Ничего, ведь состояние этого временного объекта то поменять нельзя. Фактически ситуация становится аналогичной ситуации с const lvalue reference, так собсна зачем генерировать тогда дополнительный конструктор?
void some_view::foo(int & x) {
  this->ref1 = std::ref(x);
}
void some_view::foo(int const& x) {
  this->ref2 = std::cref(x);
}

какая из этих функций совершенно неконтролируемо для языка стреляет в ногу и почему
источник

NP

Nikita Provotorov in pro.cxx
Constantine Drozdov
void some_view::foo(int & x) {
  this->ref1 = std::ref(x);
}
void some_view::foo(int const& x) {
  this->ref2 = std::cref(x);
}

какая из этих функций совершенно неконтролируемо для языка стреляет в ногу и почему
Это типа вопрос про foo(int{})?
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
Это типа вопрос про foo(int{})?
Угу. Видите ли, неконстантным левым ссылкам соответствует value category, которая имеет время жизни scope
источник

CD

Constantine Drozdov in pro.cxx
И правило языка, разрешающее преобразовывать prvalue в lvalue reference ужасно
источник

NP

Nikita Provotorov in pro.cxx
Constantine Drozdov
Угу. Видите ли, неконстантным левым ссылкам соответствует value category, которая имеет время жизни scope
Да, видимо здесь нужен необходимый базис знаний у программиста, из-за которого он добавит перегрузку к rvalue reference
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
Да, видимо здесь нужен необходимый базис знаний у программиста, из-за которого он добавит перегрузку к rvalue reference
Ага, и еще запретить auto& инициализаторы
источник

CD

Constantine Drozdov in pro.cxx
Nikita Provotorov
Да, видимо здесь нужен необходимый базис знаний у программиста, из-за которого он добавит перегрузку к rvalue reference
А еще добавить все декартово произведение перегрузок, если вы принимаете параметры
источник

NP

Nikita Provotorov in pro.cxx
Constantine Drozdov
А еще добавить все декартово произведение перегрузок, если вы принимаете параметры
Ну это наверное можно порешать с помощью forwarding references + SFINAE
источник