【发布时间】:2013-02-22 05:27:03
【问题描述】:
使用std::bind绑定成员函数时,第一个参数是对象this指针。但是,它可以将对象作为指针而不是作为指针传递。
例如看下面的程序:
#include <iostream>
#include <functional>
struct foo
{
void bar(int v) { std::cout << "foo::bar - " << v << '\n'; }
};
int main()
{
foo my_foo;
auto f1 = std::bind(&foo::bar, my_foo, 1);
auto f2 = std::bind(&foo::bar, &my_foo, 2);
f1();
f2();
}
clang 和 GCC 都毫无怨言地编译它,结果对两个绑定都有效:
富::酒吧 - 1 富::酒吧 - 2我一直试图围绕规范(第 20.8.9 节)展开思考,但这是我不太清楚的地方之一。
应该只有一个正确,还是两个都正确?
【问题讨论】:
-
Scott 的“新 c++ 概述”幻灯片 216,说两种方法都是正确的。除非 my_foo 是 unique_pointer,否则需要用 std::ref 包装,并且它不适用于弱指针
-
Scott 的概述(在最新幻灯片的第 221 页上)还说您可以使用
std::move和unique_ptr将所有权转移到bind返回的可调用对象中。它不适用于weak_ptr,因为您不能取消引用weak_ptr -
请注意,在 f1 示例中,my_foo 被复制。这不适用于不可复制的对象。如果删除 foo 的拷贝 ctor,这段代码将无法编译。
-
@Jean-BernardJansen 很高兴提到不同之处。
标签: c++ c++11 language-lawyer