You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:53:19