gpt4 book ai didi

c++ - std::bind(x, y) 到底是做什么的?

转载 作者:IT老高 更新时间:2023-10-28 23:01:03 24 4
gpt4 key购买 nike

我一直在阅读 std::bind 的描述。在 N3225 中,在 20.8.10.1 小节中.它说以下应该打印1 ,但我认为 bind应该复制它的参数,因此它应该打印0 .如果要引用传递的参数,则需要使用 std::ref对吧?

void f(int &a) { a = 1; }

int main() {
int a = 0;
std::bind(f, a)();
std::cout << a << std::endl;
}

GCC 输出 0 ,同意我认为可行的方法。但是 N3225 说 std::bind(f, a1)应返回一个调用包装器,当被 wrapper() 调用时将调用 INVOKE(f, v1) , 其中 v1应为 a (我传入的参数,换句话说,使用 binds 的传入参数,它是一个完美的转发参数,std::forward<A1>(a1))。

INVOKE(f, a)由 20.8.2 定义到 f(a) .因此,这定义了对返回的调用包装器的调用传递了原始参数。我错过了什么?

最佳答案

It says the following should print 1

不,它没有这么说。

If one wants to refer to the passed argument, one needs to use std::ref, right?

是的。

But N3225 says that std::bind(f, a1) shall return a call wrapper that when called by wrapper() will call INVOKE(f, v1), where v1 shall be a (the argument I passed in, in other words, using binds's incoming parameter which is a perfect forwarding parameter, std::forward(a1)).

那就是你错了。您在绑定(bind)调用中传入的“绑定(bind)参数”以 TiD 类型的新创建对象的形式存储。它们都是从forward<Ti>(ti) 构造 .通过说“tid 是来自 std::forward<Ti>(ti) 的 TiD constructed 类型的左值”可以相当清楚地说明这一点。由于引用包装器的特殊处理,有一个额外的“转换层”。请参阅 20.8.10.1.2/10,其中解释了 viVi涉及 tidTiD .

关于c++ - std::bind(x, y) 到底是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5065171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com