C++ 引用在std::bind中是无用的? //示例 空f(内部和n1、内部和n2) { n1++; n2++; } int main() { int n1=1,n2=2; 自动边界1=std::bind(&f,n1,std::ref(n2)); bound1();//1 3 标准::cout

C++ 引用在std::bind中是无用的? //示例 空f(内部和n1、内部和n2) { n1++; n2++; } int main() { int n1=1,n2=2; 自动边界1=std::bind(&f,n1,std::ref(n2)); bound1();//1 3 标准::cout,c++,c++11,c++14,bind,placeholder,C++,C++11,C++14,Bind,Placeholder,对通过引用接收参数的函数执行std::bind是否错误 不,没有错 绑定参数总是按值存储。因此,如果希望绑定参数引用外部对象,则必须使用引用包装 这是我的第二个问题std::占位符调用std::ref 传递给绑定函数的参数直接转发,不按值存储。因此,不需要引用包装器 对通过引用接收参数的函数执行std::bind是否错误 不,没有错 绑定参数总是按值存储。因此,如果希望绑定参数引用外部对象,则必须使用引用包装 这是我的第二个问题std::占位符调用std::ref 传递给绑定函数的参数直接转发,

对通过引用接收参数的函数执行std::bind是否错误

不,没有错

绑定参数总是按值存储。因此,如果希望绑定参数引用外部对象,则必须使用引用包装

这是我的第二个问题std::占位符调用std::ref

传递给绑定函数的参数直接转发,不按值存储。因此,不需要引用包装器

对通过引用接收参数的函数执行std::bind是否错误

不,没有错

绑定参数总是按值存储。因此,如果希望绑定参数引用外部对象,则必须使用引用包装

这是我的第二个问题std::占位符调用std::ref

传递给绑定函数的参数直接转发,不按值存储。因此,不需要引用包装器

对通过引用接收参数的函数执行std::bind是否错误

这是合法的……但正如您所注意到的,
n1
没有改变,这可能令人惊讶

使用lambda IMO更容易发现差异:

[n1和n2](){f(n1,n2);}
[n1和n2](){f(n1,n2);}

这是我的第二个问题std::占位符调用std::ref

不,但是
bind
必须同时处理
placeholder
类型和
reference\u包装器
类型

对通过引用接收参数的函数执行std::bind是否错误

这是合法的……但正如您所注意到的,
n1
没有改变,这可能令人惊讶

使用lambda IMO更容易发现差异:

[n1和n2](){f(n1,n2);}
[n1和n2](){f(n1,n2);}

这是我的第二个问题std::占位符调用std::ref

不,但是
bind
必须同时处理
placeholder
类型和
reference\u-wrapper
类型。正如您所说

除非使用
std::ref
/
std::cref
std::placeholder
,否则将复制参数

然后在调用过程中通过引用将“存储”参数传递给函数,但这不会影响在调用站点传递的对象

这可能令人惊讶,你只需要习惯它

您可以从标准的措辞()中派生出来,但老实说,整个部分相当深奥

std::thread
也是如此-如果您想全程携带引用,必须使用
std::ref

std::thread
std::bind
通常都会“稍后”执行引用的函数,即超出当前范围(您的
std::bind
示例不常见;您通常直接在那里调用
f
),因此更安全,因此您必须明确地说“如果你愿意的话,可以参考一下这个东西。这可能是设计师的基本原理,也可能不是。

正如你所说

除非使用
std::ref
/
std::cref
std::placeholder
,否则将复制参数

然后在调用过程中通过引用将“存储”参数传递给函数,但这不会影响在调用站点传递的对象

这可能令人惊讶,你只需要习惯它

您可以从标准的措辞()中派生出来,但老实说,整个部分相当深奥

std::thread
也是如此-如果您想全程携带引用,必须使用
std::ref


std::thread
std::bind
通常都会“稍后”执行引用的函数,即超出当前范围(您的
std::bind
示例不常见;您通常直接在那里调用
f
),因此更安全,因此您必须明确地说"如果你愿意,可以参考一下这个东西。这可能是设计者的基本原理,也可能不是。

n1
在调用
std::bind
时被复制。试图理解你目前的理解:你为什么对
n2
使用
std::ref
?注意:我个人几乎总是喜欢lambda而不是
std::bind
。如果我前面的评论需要更多解释:您的问题的答案似乎是,
std::bind
按值获取其参数,除非执行了特殊操作(例如使用
std::ref
)。表达式
std::bind(&f,n1,std::ref(n2))
看起来像是专门炮制的一个示例,用来证明除非做了特殊的事情(例如使用
std::ref
),否则
std::bind
按值获取其参数.那么…你是如何在不知道这个例子演示了什么的情况下想出这个例子的?我是否错过了这个问题中的一些重要内容?
n1
在调用
std::bind
时被复制了。试着理解你目前的理解:你为什么对
n2
使用
std::ref
?注意:就我个人而言,我几乎总是喜欢lambda over
std::bind
。如果我前面的评论需要更多的解释:您的问题的答案似乎是
std::bind
按值获取其参数,除非执行了特殊操作(例如使用
std::ref
)。表达式
std::bind(&f,n1,std::ref(n2))
看起来像是一个专门炮制的例子,用来证明除非做了特殊的事情(例如使用
std::ref
),否则
std::bind
会按值获取其参数。那么……你是如何在不知情的情况下想出这个例子的呢
//example

void f(int &n1, int& n2)
{
    n1++;
    n2++;
}
int main()
{
    int n1 = 1, n2 = 2;
    auto bound1 = std::bind(&f, n1, std::ref(n2));
    bound1();    // 1 3
    std::cout << n1  << n2 << endl;
    auto bound2 = std::bind(&f, std::placeholders::_1, std::ref(n2)); // 2 4
    bound2(n1);
    std::cout << n1  << n2 << endl;
}