Size: a a a

cxx.Дискуссионная

2020 February 26

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
Если не ошибаюсь, emplace использует либо std::forward либо std::move в зависимости от того что принял
Дичь
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
Если функция принимает объект класса а конструктор вызывается на месте вызова функции, должен ли я принимать && в функции а потом внутри функции std::forward ?
Покажи код
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
insert + std::move ?
Код
источник

RM

Roy Mustang in cxx.Дискуссионная
template <typename T>
constexpr void AddConnection(T&& base)
{
   auto entity = registry.create();
   m_connection.insert(std::make_pair(base.connection_, entity));
   if constexpr (std::is_same_v<T, CServer>) {
         m_connectionAppID.insert(std::make_pair(base.base_.app_id, entity));
   }
   registry.assign<T>(entity, base);
}
источник

RM

Roy Mustang in cxx.Дискуссионная
Так добавляется

NetManager.AddConnection(CServer{ev.connection_, pBaseServer->base});
источник

RM

Roy Mustang in cxx.Дискуссионная
До этого у меня было просто T base и std::move
источник

RM

Roy Mustang in cxx.Дискуссионная
Но подумал что правильней будет так как сейчас
источник

RM

Roy Mustang in cxx.Дискуссионная
registry.assign принимает
источник

RM

Roy Mustang in cxx.Дискуссионная
То есть, по сути форвард внутри уже есть
источник

KK

Konstantin Kozyrev in cxx.Дискуссионная
decltype(auto)? А зачем?
@h4cktill
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
template <typename T>
constexpr void AddConnection(T&& base)
{
   auto entity = registry.create();
   m_connection.insert(std::make_pair(base.connection_, entity));
   if constexpr (std::is_same_v<T, CServer>) {
         m_connectionAppID.insert(std::make_pair(base.base_.app_id, entity));
   }
   registry.assign<T>(entity, base);
}
Найди 2 отличия
template <typename T>
constexpr void AddConnection(T&& base)
{
   auto entity = registry.create();
   m_connection.insert(std::make_pair(base.connection_, entity));
   if constexpr (std::is_same_v<std::remove_cvref_t<T>, CServer>) {
         m_connectionAppID.insert(std::make_pair(base.base_.app_id, entity));
   }
   registry.assign<T>(entity, std::forward<T>(base));
}
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Konstantin Kozyrev
decltype(auto)? А зачем?
@h4cktill
Ссылки возвращать
источник

RM

Roy Mustang in cxx.Дискуссионная
remove_cvref_t и std::forward
источник

RM

Roy Mustang in cxx.Дискуссионная
Зачем там remove_cvref_t
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
То есть, по сути форвард внутри уже есть
Без форварда снаружи ты всегда передаешь лвалуева
источник

KK

Konstantin Kozyrev in cxx.Дискуссионная
Artöm Bakri Al-Sarmini
Ссылки возвращать
Понял, спасибо
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
Зачем там remove_cvref_t
Если передать лвалуева, T будет CServer&
источник

RM

Roy Mustang in cxx.Дискуссионная
Artöm Bakri Al-Sarmini
Если передать лвалуева, T будет CServer&
понял, спасибо
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
registry.assign принимает
Покажи объявление второго assign
источник

TS

Till Schneider in cxx.Дискуссионная
Roy Mustang
registry.assign принимает
это твой код?
источник