Size: a a a

2021 January 04

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
если ты почему то предполагаешь что другой конструктор будет работать так же, как первый - ты сам себе стреляешь в ногу
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
работа со строками (не только этот момент) в целом далека от идеала в плюсах, но это просто очередной пункт, который надо учитывать. Если гораздо более страшные вещи, чем этот редко-юзаемый конструктор
источник

AX

Alexander XaeroX in Канада IT
Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺
если ты почему то предполагаешь что другой конструктор будет работать так же, как первый - ты сам себе стреляешь в ногу
да, это ошибка, надо читать и зубрить стандарт, всё так. я к тому, что эта ошибка может вылезти очень неожиданно, т.к. всего в голове не удержишь.
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
поэтому я всегда, когда на ревью кода вижу неизвестную мне перегрузку - читаю цппреференс
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
надеяться на авось нельзя, плюсы такое не прощают конечно
источник

AX

Alexander XaeroX in Канада IT
Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺
поэтому я всегда, когда на ревью кода вижу неизвестную мне перегрузку - читаю цппреференс
вооот. а я о том, что в шаблонном коде ты её можешь не распарсить. ты ж не компилятор.
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
Alexander XaeroX
вооот. а я о том, что в шаблонном коде ты её можешь не распарсить. ты ж не компилятор.
в смысле не распарсить? Если я увижу код наподобии
template<typename Str>
void foo(Str&& str) {
 std::string copy(str, 5);
}

то еще как распарсю, тут вызов же конструтора строки
источник

d

dudehere in Канада IT
если найду снова напишу, там типо и в костко можно так платить
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺
в смысле не распарсить? Если я увижу код наподобии
template<typename Str>
void foo(Str&& str) {
 std::string copy(str, 5);
}

то еще как распарсю, тут вызов же конструтора строки
но опять же - за такой код я побью по рукам чисто за непонятный Str. Тут должен быть тогда if constexpr который проверяет строка ли это или констчар* или же выдает static_assert если ничто из этого
источник

AX

Alexander XaeroX in Канада IT
Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺
в смысле не распарсить? Если я увижу код наподобии
template<typename Str>
void foo(Str&& str) {
 std::string copy(str, 5);
}

то еще как распарсю, тут вызов же конструтора строки
и ты сразу же начнёшь смотреть перегрузки конструктора string для всех типов, вдруг там что-нибудь эдакое в foo передадут? А если класс с  operator const char*()?
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
Alexander XaeroX
и ты сразу же начнёшь смотреть перегрузки конструктора string для всех типов, вдруг там что-нибудь эдакое в foo передадут? А если класс с  operator const char*()?
когда я ревью темплейтный код, то да, я прикидываю все возвможные варианты и как они себя поведут. Как иначе?
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
ну и очень важный пункт для любого темплейтного кода - куча юнит тестов для разных типов. Причем в идеале lvalue/rvalue
источник

AX

Alexander XaeroX in Канада IT
Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺
когда я ревью темплейтный код, то да, я прикидываю все возвможные варианты и как они себя поведут. Как иначе?
это уже из области "когда я вижу набор перегрузок, то прикидываю все варианты, какие и когда выберутся" :) Согласен, правила разрешения перегрузок вполне чётко описаны в стандарте, только вот в уме это не совсем удобно делать бывает (особенно в тех же шаблонах)
источник

AX

Alexander XaeroX in Канада IT
Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺
ну и очень важный пункт для любого темплейтного кода - куча юнит тестов для разных типов. Причем в идеале lvalue/rvalue
в идеальном мире - да. В амзн вы это делали?
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
Alexander XaeroX
это уже из области "когда я вижу набор перегрузок, то прикидываю все варианты, какие и когда выберутся" :) Согласен, правила разрешения перегрузок вполне чётко описаны в стандарте, только вот в уме это не совсем удобно делать бывает (особенно в тех же шаблонах)
потому что открытые шаблоны зло. Нужно либо концепты (в 20 стандарте), либо искусственно ограничивать типы через enable_if/if constexpr/static_assert и подобные
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
Alexander XaeroX
в идеальном мире - да. В амзн вы это делали?
да, конечно, у меня там на некоторые либы, которые глубоко в ядре системе и как раз сильно шаблонные - было по 1-2к юнит тестов
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
эта тысяча юниттестов не руками конечно пишется, а генерится через catch2/google test. Они оба умеют в шаблонизированные тесты
источник

AX

Alexander XaeroX in Канада IT
Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺
потому что открытые шаблоны зло. Нужно либо концепты (в 20 стандарте), либо искусственно ограничивать типы через enable_if/if constexpr/static_assert и подобные
согласен, но в enable_if иногда тоже можно ошибиться. ну там cv забыть снять при проверке, и начнётся...
источник

AX

Alexander XaeroX in Канада IT
Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺
эта тысяча юниттестов не руками конечно пишется, а генерится через catch2/google test. Они оба умеют в шаблонизированные тесты
👍
источник

DK

Denis K. 🇨🇦🚜🇺🇸🚜🇷🇺... in Канада IT
Alexander XaeroX
согласен, но в enable_if иногда тоже можно ошибиться. ну там cv забыть снять при проверке, и начнётся...
false negative это не страшно
источник