Ivan
вы не запретили copy ctor
Я возможно давно не спал, но : test operator=(const test& t) = delete;
Ivan
Код не мой, но в любом случае инетересно :)
Constantine
Я возможно давно не спал, но : test operator=(const test& t) = delete;
это CopyAssignment, надо делитить вот так test(const test& t) = delete; //THIS LINE test operator=(const test& t) = delete;
Constantine
а ну лан , не буду
имя _A зарезервировано, например
Deleted Account
имя _A зарезервировано, например
в какой области видимости?
Deleted Account
а ну лан
Deleted Account
я то пока пишу m_val но как раз хотел переехать на _val
Anatoly
я то пока пишу m_val но как раз хотел переехать на _val
переходи на гугловское соглашение val_
Constantine
Alexander
почему это компилится?
потому что видимо все что угодно можно привести к void, в том числе std::function
Constantine
потому что видимо все что угодно можно привести к void, в том числе std::function
на самом деле std::function допускает implicit cast возвращаемого значения
Deleted Account
переходи на гугловское соглашение val_
ага и как будет выглядеть вызов мемберов??? val_.kek
Deleted Account
отвратительно
Ivan
это CopyAssignment, надо делитить вот так test(const test& t) = delete; //THIS LINE test operator=(const test& t) = delete;
Да, я почему-то решил что дефолтный copy-ctor не будет сгенерирован если есть user-defined.
Ivan
Спасибо
Constantine
Да, я почему-то решил что дефолтный copy-ctor не будет сгенерирован если есть user-defined.
Правила выключения не такие а вот class() будет выключен за любой конструктор
Anatoly
отвратительно
компилятор тебя поймет, а все остальное дело привычки/вкуса
Constantine
Да, я почему-то решил что дефолтный copy-ctor не будет сгенерирован если есть user-defined.
explicit /*ПИШИ ЭТО СЛОВО*/ test(const VALUE & value = VALUE()) : _value(value) {}
Игорь
Не подскажите чей это алгоритм?
Constantine
ща сгодь и до тебя дойдем
Anatoliy
Такие имена зарезервированы _[A-Z_].*
Олександр
Такие имена зарезервированы _[A-Z_].*
Еще зарезервированы любые содержащие __ и глобальные, которые начинаются с _.
Artöm
В глобальной области видимости нельщя еачинать с одного _ вне зависимости от того, заглавная буква или прописная дальше идет, насколько я помню. Это для совместимости с C. В каком-либо пространстве имен или в классе можно
Artöm
правила резервирования имен, начинающихся с _ в студию
Anatoliy
это не повод писать потенциально опасный код
Так и не понял чем тот код опасен. Там нет ошибочного исползования нигде. Везде всё так как мной и задумано. Я давал ссылку на мою имплементацию multivisit для variant. Там второй случай использования этой идиомы. Когда во временных структурах я создаю ссылки на выводимые параметры, чтобы в конце зафорвардить их в визитор. Ты предлагаешь мне там везде (на каждом промежуточном шагу, который должен быть compiled out в итоге при оптимизациях) копировать параметры функции во временные места, пока они в конце не понадобятся? Зачем это надо?
Anatoliy
Еще зарезервированы любые содержащие __ и глобальные, которые начинаются с _.
а у меня что написано? вроде бы ясно указано что __ тоже не годится
Anatoliy
про глобальные - это да. Это для линковки с C
Крылатый
А давайте посмотрим в стандарт!
Anatoliy
годится
Олександр
а у меня что написано? вроде бы ясно указано что __ тоже не годится
Each name that contains a double underscore (__) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use. EDIT: Это для глобальных идентификаторов
Constantine
нука-нука и как же?)
namespace detail { template <class F, class Tuple, std::size_t... I> constexpr decltype(auto) apply_impl(F&& f, Tuple&& t, std::index_sequence<I...>) { return std::invoke(std::forward<F>(f), std::get<I>(std::forward<Tuple>(t))...); } } // namespace detail template <class F, class Tuple> constexpr decltype(auto) apply(F&& f, Tuple&& t) { return detail::apply_impl( std::forward<F>(f), std::forward<Tuple>(t), std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>{}); }
Constantine
и не создавать lvalue reference на temporary чтобы меньше букв
Anatoliy
так это какой-то чел пишет, который не задумывался даже о том, что можно так, как я написал. Но будь уверен, что он бы хотел однобуквенный префиксный оператор типа @x, эквивалентный std::forward< decltype(x) >(x).
Anatoliy
и не создавать lvalue reference на temporary чтобы меньше букв
Зачем? Ты задавал себе этот вопрос?
Constantine
Зачем? Ты задавал себе этот вопрос?
ну потому что ты именно это и делаешь
Anatoliy
ну потому что ты именно это и делаешь
просто чтобы поспорить, значит
Constantine
я просто не вижу смысла вас переубеждать
Constantine
но если бы я был овнером репозитория и мне бы так форвардили, я бы в жизни пуш не принял, потому что вам лень писать две буквы но не лень писать комменты "WARNING THIS REFERENCE SHOULD BE REFERENCE TO TEMPORARY IT WILL BE MOVED"
Anonymous
🙈
Constantine
MY TWO KEYBOARDS DIED BECAUSE OF THIS GODDAMN forward<T😠t) SYNTAX
Constantine
Эта идиома используется в логически завершённом коде. Неумехи в такой не лезут.
> если вы ничего не понимаете в МОЕМ коде, пожалуйста, не трогайте его
Aidar
можно тупой вопрос?
Aidar
почему std::string::c_str()const не является std::string::c_str()const&
Anatoly
почему std::string::c_str()const не является std::string::c_str()const&
потому что foo((std::string("hello ")+name).c_str()) вполне себе use case
Aidar
дык это же будет работать
Anatoly
дык это же будет работать
(std::string("hello ")+name) - temporary object
Aidar
const string&
Aidar
или не будет?
Alexander
+ новую строку вернет
Aidar
просто выдел тыщу раз уже в супапро челиков которые пишуь const char* foo = getstring().c_str();
Anatoliy
> если вы ничего не понимаете в МОЕМ коде, пожалуйста, не трогайте его
Это чистая и ясная идиома. Я её объясняю в двух предложениях. Она идиологически хорошо согласуется с самим языком. Ты не платишь за то, что не используешь.
Aidar
ну ваще на самом деле логично делать это и с временными да, соглашусь
Aidar
жаль что в плюсцах об этом надо думать
Constantine
почему std::string::c_str()const не является std::string::c_str()const&
пушо нет разницы между const и const&
Constantine
пушо const&& конвертируем в const&
Constantine
а const это либо const& либо const&&
Aidar
кстати еще нельзя в ваших плюсцах сделать это
Constantine
это тупо legacy дефект языка
Aidar
заблочить const метод на временный
Igor
опережая @zamazan4ik'а, Conan 1.2 is out: http://docs.conan.io/en/latest/changelog.html
Aidar
го список дефектов языка создавать
Constantine
я согласен, что параметр типа "only read" должен приниматься как const&& и const& должен через implicit конвертироваться в const&&
Constantine
а не наоборот
Constantine
го список дефектов языка создавать
мы случайно Rust++ напишем
Constantine
там в структуре ссылочных типов еще нельзя typecast блочить
Constantine
Derived& в Base&
Aidar
можно не юзатть наследование
Constantine
это принципиально в синтаксисе operator ==