Александр
это по годам, если что
Александр
2011, 2014, 2017, 2020
🦥Alex Fails
Еще есть 98
Александр
и 03
Dmitry
> добавляет возможностей
пора бы уже начать запрещать что-нибудь
🐙 Antony
и 03
А вот переход с 03 на 11 - потребут обучения, т.к. в 11 было добавлено несколько концептуальных вещей, которых нет в других языках программирования и с которыми больше люди нигде не сталкивались
🦥Alex Fails
Nikita
Александр
пусть ломают
Александр
хоть фич добавится
Александр
из-за долбаной обратной совместимости развиваться не дают
Constantine
хех.. а я не знал
static_assert(!std::is_same<char, signed char>::value && !std::is_same<char, unsigned char>::value, ""); //neither
Александр
#holywar
Nikolai
Stanislav
🦥Alex Fails
Constantine
?
Constantine
какая-то известная история? на триграфах код писали?
🦥Alex Fails
Триграфы
Ivan
Парни ещё вопрос связанный с семантикой перемещения, по ссылке в коде: http://cpp.sh/3ktkr
🦥Alex Fails
🦥Alex Fails
EBCDIC — Википедия
ru.wikipedia.org
EBCDIC (англ. Extended Binary Coded Decimal Interchange Code — расширенный двоично-десятичный код обмена информацией; произносится «эб-си-дик») — стандартный восьмибитный код...
Constantine
на земле вообще нужны сигнатуры фунцкий
Constantine
void foo(std::string&& s) ?
Constantine
почему не получать void foo(std::string s) ?
🦥Alex Fails
Что?
Ivan
а как надо? @webreh
Dmitry
человек в D захотел)
Constantine
не знаю, мне всегда хотелось просто писать void foo(std::string s)
Constantine
и не будет приколов с тем, что параметр, переданный по && на самом деле не разрушен по-правильному
Dmitry
пиши string_ref
Constantine
хотя функция в данном случае должна была const std::string& получать
🦥Alex Fails
🦥Alex Fails
Constantine
семантика разная
Constantine
пропустит вызов с конструктором копирования или нет
Ivan
то есть это так надо писать?
Constantine
void foo(const std::string& s) надо написать
Constantine
и не перемещать
Ivan
не, я хочу переместить
Constantine
зачем?
Александр
если просто делать std::move() при подстановке аргумента, ничего не произойдёт - передача как по ссылке
а && говорит, что внутри функции следует куда-то переместить
Ivan
чтобы понять как работает &&
Constantine
короче && позволяет получателю поломать объект до состояния, в котором отработает деструктор
Александр
std::move() никуда ничего не перемещает. он просто приводит тип к type&&
Александр
ага. при передаче по обычном ссылке так тоже можно сделать, но это будет неприлично
Constantine
использовать после первой передачи по std::move объект это завязка на реализацию
Dmitry
🦥Alex Fails
Александр
Dmitry
ясно
🦥Alex Fails
std::move ничего не перемещает. std::forward ничего не передает.
Dmitry
вот именно!
Александр
на эту тему лучше почитать длинные статьи, в двух словах сложно объяснить все детали
🦥Alex Fails
Dmitry
void_t берёт на вход ему не нужное - жадный какой-то
Ivan
то есть вот это каноничный вариант: http://cpp.sh/32myb
Constantine
короче && это все еще ссылка
void do_nothing(std::unique_ptr<int>&& p) {};
void black_hole(std::unique_ptr<int> p) {};
Constantine
просто пример очень неправильный
Constantine
функции foo нет смысла делать что-то с объектом
Constantine
ей достаточно const&
Ivan
я хочу чтобы она уничтожила объект
Constantine
пиши функцию void add_to_vector(std::vector<string> &vector, std::string s)
Constantine
если ты вызовешь add_to_vector(v, str) то str будет скопирована
Constantine
если вызовешь add_to_vector(v, std::move(str)) перемещена
Constantine
перемещение _не обязано_ поломать объект, но почти всегда на самом деле это сделает
Ivan
чуваки, я хочу переместить строку вникуда
Ivan
чтобы она сломалась
Constantine
нет гарантий, что она сломается
Constantine
перемещение - это возможность, а не обязанность
Ivan
тогда он скопирует же
Александр
мув оставь
Constantine
нет
Ivan
аа, move оставить? Ну ок.
Constantine
у std::string определен конструктор с string&&