Size: a a a

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

2020 February 27

RM

Roy Mustang in cxx.Дискуссионная
Мы передаем std::function как rvalue с помощью && и так же потом помещаем в map из std::funciton
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
и там даже не insert а emplace + std::forward должен быть, нет?
Не стоит эмплейсить в мапу, если ключ скорее всего есть
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
Я никак не разберусь в rvalue и lvalue, я понимаю, что rvalue - это все что не lvalue, а std::function по сути может быть lvalue, когда мы в него пихаем функцию?
lvalue это то, у чего можно взять адрес через &
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
std::function же rvalue получается?
std::function это тип
источник

RM

Roy Mustang in cxx.Дискуссионная
Artöm Bakri Al-Sarmini
Не стоит эмплейсить в мапу, если ключ скорее всего есть
Имеешь в виду, если может быть случайно попытка поместить существующий ключ?
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
std::function же rvalue получается?
В плане value category std::function ничем от инта не отличается
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
Имеешь в виду, если может быть случайно попытка поместить существующий ключ?
Да
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Или не случайно
источник

RM

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

RM

Roy Mustang in cxx.Дискуссионная
Блин, некоторые простые вещи даются сложно для меня
источник

RM

Roy Mustang in cxx.Дискуссионная
Только со временем понимать начинаю
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Roy Mustang
Это означает что я должен внутри RegMsgCallback использовать std::forward, разве нет?
Это зависит от того, как оно принимается, а не от того, как оно отдается
источник

RM

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

RM

Roy Mustang in cxx.Дискуссионная
а иначе move, поэтому там в insert нужен move, потому что он в значении std::function принимает не &&
источник

RM

Roy Mustang in cxx.Дискуссионная
Тогда мне не понятно вот что, я не всегда передаю функцию из класса в RegMsgCallback, вот к примеру
NetServer.RegMsgCallback(NET_SERVER_TYPE::SV_WORLD,    protoid::proto_common_clsv_relationship_register_send,    proto::proto_common_clsv_relationship_register_recv);

тут я передаю функцию из namespace, то есть, это не из класса функция, а значит вызывается RegMsgCallback перегрузка
bool RegMsgCallback(const NET_SERVER_TYPE type, const uint16_t protoid, NET_MSG_FUNCTOR&& cb);

Но почему тогда я не форвардю эту функцию если RegMsgCallback принимает && ?
источник

RM

Roy Mustang in cxx.Дискуссионная
Её нельзя форвардить потому что это функция глобальная, а не созданная на месте через какой нибудь bind?
источник

AB

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

RM

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

RM

Roy Mustang in cxx.Дискуссионная
Она же не мувнется
источник

AB

Artöm Bakri Al-Sarmini in cxx.Дискуссионная
Рой ты сука
источник