std::tag_invoke是否仅为将所有参数完美转发至无限定tag_invoke调用的对象?
关于std::tag_invoke的作用与实现疑问
我知道std::tag_invoke并非技术上必需的,但它的作用到底是什么?
我原本的理解是:tag_invoke的意义在于,我们可以通过重载tag_invoke(decltype(some::cpo), Foo const&),为自定义类型Foo定制some::cpo的行为;而template<typename T> auto Cpo::operator()(T&& arg)会被实现为对tag_invoke(some::cpo, arg)的无限定调用——这样该调用就能通过ADL找到我们自定义的tag_invoke重载,从而把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<decltype(args)>(args)...); } } tag_invoke; }
另外,提案里把它称为元定制点对象。但在我看来,如果它是按上面的代码定义的,那它根本算不上一个CPO(定制点对象)。而且我们也不会希望它是CPO,因为它必须始终执行相同的操作:把所有参数转发给无限定的tag_invoke调用。
我是不是忽略了什么关键点?
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

