Constantine
if (_Inside(std::addressof(val)))
Ostap ꑭ
У гцц поприятней читать стл, чем у вижака
Nikita
ну стандарт вряд ли специфицирует поведение push_back если вставляют элемент этого же контейнера
Constantine
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)
Очевидного вроде бы никакого, но если не очевидного?
Constantine
Nikita
Type это параметр шаблона у func?
ed
Constantine
Constantine
Да
А можно тогда полную сигнатуру функции, а то телепатические способности не у всех
Constantine
ed
template<typename Type> void func(const Type& arg)
template<typename Type> void func(Type&& arg)
Простите, не подумал..
Вообще да, это я про push_back из вектора..
Constantine
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
насколько я знабю
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
при такой логике
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
да, я ошибся
Matwey