Constantine
тебе доделать пример до убийства ноги?
🦥Alex Fails
Anatoliy
я не пойму на чём ты настаиваешь
Anatoliy
конечно доделай, может в чём и разберёшься
Anatoliy
твой враппер не учитывает случаи move-only объектов. У тебя он всегда делает copy-construction
Anatoliy
а ещё бывают non-copyable non-moveable объекты
Крылатый
non-creatable
Anatoliy
да. ещё один хороший пример
Anatoliy
ссылку на них можно иметь, но к себе во враппер ты их не скопируешь/не переместишь
Constantine
я не пойму на чём ты настаиваешь
я настаиваю, что вот это - антипаттерн template <typename T> T f(T& t) { return forward<T>(t); }
Constantine
и что для T& t использовать forward<T> (t) - изначальный расстрел ноги
Constantine
потому что синтаксическая декларация "я принимаю ссылку" не соответствует "я собираюсь уничтожить объект, принятый по ссылке"
Constantine
потому что такая декларация пишется как T&&
Constantine
и экономия кода на forward<T> (t) не стоит расстрела ноги
Anatoliy
Паттерном (идиомой) я называл там следующее: template< typename T > decltype(auto) f(T && x) { auto & x0 = x; // это как бы параметры промежуточных функций в твоём насыщенном template-ами коде auto & x1 = x0; // ... auto & xn = x1; return std::forward< T >(x); }
Deleted Account
потому что синтаксическая декларация "я принимаю ссылку" не соответствует "я собираюсь уничтожить объект, принятый по ссылке"
интаксическая декларация "я принимаю ссылку" вообщето соответствует "я собираюсь уничтожить объект, принятый по ссылке"
Anatoliy
ты понимаешь в чём здесь идиоматичность? в том, что не надо писать очередной раз T && x а потом (std::forward< T >(x)) 100500 раз до тех пор когда у тебя опять будет выводиться тип?, когда это ничего не даёт
Deleted Account
не видиш конст в сигнатуре, не отдавай свои ссылки
Anatoliy
ты сам код пишешь. у тебя тип уже всё время выведен. компилятору меньше времени компилировать, если не нужно каждый раз выводить вновь и вновь
Constantine
потому что правильная реакция именно такая
Anatoliy
Compilation failed?
Anatoliy
или какая?)
Constantine
да
Constantine
wrapper не может использоваться вот так
Anatoliy
зачем ты из foo возвращаешь wrapper? Это же деталь реализации
Anatoliy
может
Anatoliy
это мой внутренний код
Constantine
зачем ты из foo возвращаешь wrapper? Это же деталь реализации
а детали реализации не переиспользуются?
Constantine
короче, вопрос: стоит ли допускать потенциальный расстрел ноги ради экономии букв кода в шаблонном коде на С++?
Constantine
ответ: нет
Constantine
ваш "паттерн" призван сократить число букв в коде ценой ошибочного использования
Anatoliy
короче, вопрос: стоит ли допускать потенциальный расстрел ноги ради экономии букв кода в шаблонном коде на С++?
ты значешь, что в имплементации стандартной библиотеки везде есть UB? это законно
Anatoliy
(причём в приведённом мной коде его нет)
Constantine
ты значешь, что в имплементации стандартной библиотеки везде есть UB? это законно
я знаю, что в имплементации стандартной библиотеке есть ОЧЕНЬ неприятные вещи
Anatoliy
но даже если бы и был, то в деталях реализации ты можешь UB использовать
Constantine
в основном по legacy причинам
Constantine
это не повод писать потенциально опасный код
Anatoliy
нет.
Anatoliy
это принципиально
Constantine
хорошо, давайте так
Anatoliy
давай ссылку дам?
Constantine
да зачем мне ссылки
Constantine
std::vector::operator []
Constantine
частота использования не менее 1 на 1000 строк кода любого проекта
🦥Alex Fails
std::vector::operator []
Это из-за того, что он реф возвращает?
Deleted Account
std::vector::operator []
ненавижу этот оператор
Anatoliy
https://stackoverflow.com/questions/48490710/negative-size-t#comment83974607_48490710 вот этот коммент ясно говорит о том, что в деталях реализации не может быть антипаттернов, если в целевом окружении всё работает как предполагается
Constantine
Это из-за того, что он реф возвращает?
Да, он возвращает ref не имея ref qualifier
Constantine
std::function<void()> lambda = [&] () { return lambda; };
Constantine
вот это мое любимое
Constantine
просто одно выражение, показывающее стандартную библиотеку
🦥Alex Fails
Да, он возвращает ref не имея ref qualifier
Так го пропоспл еще закинем. Или defect report!
Constantine
Мне кажется, такое не проходит по принципу "нельзя убить ногу"
Constantine
Расскажут что legacy код сломается
Constantine
(он сломается)
🦥Alex Fails
да с первого взгляда оно не ломается. Только если схороняет ссылку
Constantine
ну стандартный rvalue to lvalue conversion
Alexander
почему это компилится?
Alexander
std::function<void()> lambda = [&] () { return lambda; };
Constantine
да с первого взгляда оно не ломается. Только если схороняет ссылку
std::vector<std::vector<int>> k(); void f(std::vector<int> & v) { } void g() { f(k()[0]); }
Constantine
вон товарищ просто весь код так пишет с этим преобразованием в details
Ivan
Вы лучше скажите почему это компилится без варнингов
Ivan
https://pastebin.com/rqeJvPnz
Ivan
:)
Anatoliy
Вы лучше скажите почему это компилится без варнингов
потому что в левой части нет зависимого типа. там ничего не выводится
Constantine
https://pastebin.com/rqeJvPnz
VALUE _value; не пишите так или в супапро отправят
Deleted Account
https://pastebin.com/rqeJvPnz
Важно: Не используйте pastebin.com. Судя по всему, это наиболее популярный в данной категории сайт, но он является медленным, содержит большое количество рекламы и плохо отображает форматирование текста (это испортит ваш код). Многие люди не могут даже открыть этот сайт из-за агрессивных фильтров спама . используйте termbin.com wandbox/ideone/coliru
Ivan
хм, спасибо
Constantine
https://pastebin.com/rqeJvPnz
вы не запретили copy ctor
Constantine
чойт
правила резервирования имен, начинающихся с _ в студию
Deleted Account
и то там два символа _
Constantine
нет таких, тока в си каком то
ты не знаешь эти правила, так что не спорь
Deleted Account
а в даном случае это подразумевает укороченое m_val