gpt4 book ai didi

c++ - 占位符可以与 ref() 一起使用吗

转载 作者:太空狗 更新时间:2023-10-29 20:25:29 24 4
gpt4 key购买 nike

我正在使用 C++11 功能,并且刚刚试验了以下代码:

void dump(ostream &os, const MyType &mt)
{

}

void f(const vector<MyType> &mts, ostream &os)
{
for_each(mts.begin(), mts.end(), bind(dump, ref(os), ref(_1));
}

此代码在 clang 处编译错误:

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_algo.h:4417:2: error: no matching function for call to object of type
'std::_Bind<void (*(std::reference_wrapper<std::basic_ostream<char> >, std::reference_wrapper<const std::_Placeholder<1> >))(std::basic_ostream<char>
&, const MyType &)>'
__f(*__first);

如果我从 _1 中删除 ref,它编译得很好:

for_each(mts.begin(), mts.end(), bind(dump, ref(os), _1);

占位符似乎不符合引用,但只是想确认一下,你能列出为什么不符合的语义定义吗?它实际上已经通过引用传递了吗?

最佳答案

std::ref() 用于通过引用传递值,否则将作为拷贝传递。

在您的代码中,它用于传递 os,这是一个显然您不想复制的本地名称。

请记住,是对 std::bind() 的调用进行了复制。也就是说,std::bind() 返回的值包含每个传递对象的拷贝。 std::ref() 阻止复制并保留一个引用。

但占位符实际上并不是 std::bind() 返回的对象中的值。相反,它们是指示函数将第 n 个参数转发给包装函数的标记。这里的关键词是转发:因为值是转发的,所以如果您的函数需要引用,它将作为引用传递,如果您的函数需要拷贝,它将作为拷贝传递。

因为 _1 不是要传递给函数的实际值,而是一个库技巧,使用 std::ref() 发出信号从哪里获取该值 没有意义。

关于c++ - 占位符可以与 ref() 一起使用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23878763/

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