Constantine
if (_Inside(std::addressof(val)))
Ostap ꑭ
У гцц поприятней читать стл, чем у вижака
Constantine
У гцц поприятней читать стл, чем у вижака
У шланга я прямо таки кайфовал, честно говоря)
Nikita
if (_Inside(std::addressof(val)))
такое ощущение что это защита от дурака
Constantine
такое ощущение что это защита от дурака
такое ощущение, что это безумная тонкость
Nikita
ну стандарт вряд ли специфицирует поведение push_back если вставляют элемент этого же контейнера
Nikita
если я правильно понял, то там смотрится, лежит ли вставляемый элемент в контейнере
Nikita
если да то перемещается назад
Constantine
да
Constantine
и в этом случае делается, как кажется, совершенно то же самое
Nikita
ну такое поведение требуется стандартом?
Constantine
я не понимаю, в чем принципиальная разница веток ифа
Constantine
а, я понял!
Constantine
*WALL*
Constantine
да, все ок
Constantine
правда странно, что это написано именно так
Nikita
в первой ветке скопируется а во втором мувнется?
Constantine
нет
Constantine
this->_Getal().construct(_Unfancy(this->_Mylast()), _STD forward<value_type>(this->_Myfirst()[_Idx]));
Constantine
это может не совпадать с _Val в случае реаллокации памяти
Joy
https://lkml.org/lkml/2018/3/20/845
Joy
сам оценить не в состоянии, но хоть поделюсь
Constantine
в чем вопрос?
Constantine
я слышал, что проверить, является ли некоторое выражение constexpr очень просто в С++
ed
Хмм, а есть ли смысл в дополнительном реализации функции с аргументом void func(Type& arg) Если есть void func(Type&& arg) Очевидного вроде бы никакого, но если не очевидного?
Nikita
Type это параметр шаблона у func?
ed
Да, есть, например, std::vector::push_back
А разве оно там не рудиментом с прошлого стандарта осталось?
Constantine
Да
А можно тогда полную сигнатуру функции, а то телепатические способности не у всех
ed
Нет, перегрузка принципиально
А почему так, не подскажите?
Constantine
А почему так, не подскажите?
Еще раз, если вы не дописали что-то про функцию, ответ может быть другим
Nikita
Нет, перегрузка принципиально
у вектора есть перегрузка для не константной lvalue ссылки? О_о
ed
template<typename Type> void func(const Type& arg) template<typename Type> void func(Type&& arg) Простите, не подумал.. Вообще да, это я про push_back из вектора..
Nikita
короче тебе нужно почитать про forwarding references
Nikita
если кратко то template<typename Type> void func(const Type& arg) template<typename Type> void func(Type&& arg)и using Type = ...; void func(const Type& arg) void func(Type&& arg)это разные вещи
Constantine
В частности template <typename T> struct hello { /* //мы пишем STL void assign_t(T&&); void assign_t(T const&); */ //если жаба не душит за лишнее перемещение, можно просто void assign_t(T t) { t_ = std::move(t); } private: T t_; };
Constantine
struct hello2 { template <typename T> void assign_t(T&& t) { t_ = std::forward<T>(t); } private: std::any t_; };
Nikita
я из этого чата недавно вычитал, что термин forwarding reference добавили в стандарт только в C++17 а как тогда такие ссылки раньше назывались?
Constantine
никогда не интересовался названием
Constantine
имхо это просто правило шаблонного вывода типа
Sergey
Universal references
Constantine
что-то что зачастую позволяет написать перевызов функции)
Nikita
это название придумал скотт мейерс
Nikita
и оно не было в стандарте
Sergey
Ну так официально они никак не назывались раньше
Nikita
насколько я знабю
Constantine
и оно не было в стандарте
этот синтаксис точно допустим в С++11 и значит ровно это
Nikita
но комитету же надо было как то обзывать эту штуку хотя бы на совещаниях
ed
Нет, стоп, я про другое спрашивал, вероятно я некорректно вопрос ставлю.. Но погодите, сам догнал. Да, протупил..
Dadaskis
D:/C++ Projects/MapGenerator/Application.cpp:10: multiple definition of `windowSizeCallback(GLFWwindow*, int, int)' obj\Debug\Application.o:D:/C++ Projects/MapGenerator/Application.cpp:10: first defined here Указал функцию только один раз, проверял. И так ещё с несколькими.
Nikita
функция случаем не внутри h определена?
Nikita
(не путать определение с объявлением)
Sergey
Почисти прежде всего дерево сборки
Sergey
И проверь include guardы
Anonymous
Добрый вечер. Я совсем новичек в C++. Есть идея создания своего анонимного чата где бы человек мог общатся с другим по средсву обменов Qr кодов и между ними создавалась бы шифрованное соедитение.
Anonymous
Можете подсказать что читать
Anonymous
где учить
Dadaskis
И так, дерево сборки чистил, не помогло. Include Guard'ов почекал, хотя толку если нигде нету упоминания такого имени.
Anatoly
я из этого чата недавно вычитал, что термин forwarding reference добавили в стандарт только в C++17 а как тогда такие ссылки раньше назывались?
в С++ 14 If P is a cv-qualified type, the top level cv-qualifiers of P’s type are ignored for type deduction. If P is a reference type, the type referred to by P is used for type deduction. If P is an rvalue reference to a cvunqualified template parameter and the argument is an lvalue, the type “lvalue reference to A” is used in place of A for type deduction. [ Example: template <class T> int f(T&&); template <class T> int g(const T&&); int i; int n1 = f(i); // calls f<int&>(int&) int n2 = f(0); // calls f<int>(int&&) int n3 = g(i); // error: would call g<int>(const int&&), which // would bind an rvalue reference to an lvalue
Anatoly
только, int n2 = f(0); // calls f<int>(int&&) содержит ошибку, поскольку вызов будет f<int>(int)
Anatoly
или в С++ 14 была именно передача rvalue reference?
Nikita
ну вроде да...
Nikita
меня пугает слово была
Nikita
сейчас поменяяли чтоли?
Nikita
https://wandbox.org/permlink/xsZzLUy2Y1NtoztQ
Anatoly
ну, я всегда считал, что при perfect forwarding в случае tempate<typename T> void foo(T&&) будет следующий вывод: int d = 0; foo(d); // foo(int&); foo(10); // foo(int);
Anatoly
а в примере С++ 14 какая-то лажа: int n2 = f(0); // calls f<int>(int&&)
Nikita
но если вместо int был бы непримитивный тип, то произошёл бы лишний мув
Nikita
при такой логике
Anatoly
но если вместо int был бы непримитивный тип, то произошёл бы лишний мув
в каком случае? t - временный объект, временным объектом конструируется аргумент foo(T), вызывая move contructor T(T&&). где лишний?
Nikita
ну представь такой код: template<typename T> void f(T &&v) { auto moved = std::move(v); }В той ситуации, какой ты описываешь, вызов этой функции от временного объекта f(Value{}); привело бы к такой инстанциации: template<typename T> void f(T v) ...т.е. мы бы сначала мувнули в аргумент функции а только потом в переменную moved у тела функции
Nikita
ой, инстанциация была бы void f(Value v)
Nikita
совсем голова пухнет уже
Anatoly
да, я ошибся