Является ли std::tag_invoke просто объектом с оператором(), который идеально пересылает все аргументы на неквалифицироваC++

Программы на C++. Форум разработчиков
Anonymous
Является ли std::tag_invoke просто объектом с оператором(), который идеально пересылает все аргументы на неквалифицирова

Сообщение Anonymous »

Я понимаю, что std::tag_invoke не является технически необходимым, но что он делает?
Я думал, что смысл tag_invoke в том, что вы можете настройте some::cpo для вашего типа Foo, перегрузив tag_invoke(decltype(some::cpo), Foo const&); template auto Cpo::operator(T&& arg) будет реализован как неквалифицированный вызов tag_invoke(some::cpo, arg), поэтому вызов найдет ваш< /em> перегрузка tag_invoke через ADL, что приводит к маршрутизации cpo(Foo{}) на tag_invoke(decltype(some::cpo), Foo const&).Но тогда как это возможно через std::tag_invoke объект? Я не вижу, чтобы это было определено в P1895R0.
Это действительно что-то вроде этого?

Код: Выделить всё

namespace std {
inline constexpr struct TagInvoke {
inline constexpr decltype(auto) operator()(auto&& ...args) const {
return tag_invoke(std::forward(args)...);
}
} tag_invoke;
Кроме того, в предложении это называется мета-объектом-точки настройки. На мой взгляд, если он определен, как в предыдущем фрагменте, это вообще не CPO. И вы даже не хотите, чтобы это было так, потому что он всегда должен делать одно и то же, то есть пересылать все на неквалифицированный вызов tag_invoke.
Я что-то упустил?

Подробнее здесь: https://stackoverflow.com/questions/786 ... rds-all-ar

Вернуться в «C++»