LINUX.ORG.RU

Вносите Эдика.

anonymous
()
Ответ на: комментарий от Deleted

Немного код в примере перепутал с экспериментом. Исправил

KennyMinigun ★★★★★
() автор топика
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от Deleted

Ящетаю, это баг в стандарте. Ведь с пользовательскими типами все работает (в большинстве своем) изза дефолтного T& operator=(T&&).

#include <type_traits>

struct T { T& operator=(T&&) = delete; /* kablamo, type_traits! */ };

int main() {
  return std::is_assignable_v<T, T>;
}

https://cppinsights.io/lnk?code=I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKc3RydWN0IFQgeyBUJiBvcGVyYXRvcj0gKFQmJikgPSBkZWxldGU7IH07CgppbnQgbWFpbigpIHsKICByZXR1cm4gc3RkOjppc19hc3NpZ25hYmxlX3Y8VCwgVD47Cn0K&insightsOptions=cpp17&std=cpp17&rev=1.0

KennyMinigun ★★★★★
() автор топика
Последнее исправление: KennyMinigun (всего исправлений: 3)
Ответ на: комментарий от KennyMinigun

Тут просто различие в семантике присвоения: вот так должен выглядеть оператор присвоения, аналогичный таковому для встроенного типа - T& operator=(const T&) &(внимание на перегрузку по lvalue для this). Так наверное и для user-defined не сработает. Для перемещения тоже самое, КМК

Deleted
()
Последнее исправление: dllmain (всего исправлений: 1)

По человекопонятному замыслу должен выглядеть так (псевдокод)

template <class T, class V> is_true_assignable_v = is_assignable_v<T&,V>

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.