【发布时间】:2013-07-25 07:33:22
【问题描述】:
我正在努力与std::function 相处。从参考here 可以看出std::function 的ctor 的参数应该是可调用的和可复制构造的。所以这里是一个小例子:
#include <iostream>
#include <type_traits>
#include <functional>
class A {
public:
A(int a = 0): a_(a) {}
A(const A& rhs): a_(rhs.a_) {}
A(A&& rhs) = delete;
void operator() ()
{
std::cout << a_ << std::endl;
}
private:
int a_;
};
typedef std::function<void()> Function;
int main(int argc, char *argv[])
{
std::cout << std::boolalpha;
std::cout << "Copy constructible: "
<< std::is_copy_constructible<A>::value << std::endl;
std::cout << "Move constructible: "
<< std::is_move_constructible<A>::value << std::endl;
//Function f = A();
return 0;
}
我们有可调用、可复制构造但不可移动构造的类。我相信这应该足以将其包装在Function 中。但是,如果您取消注释注释行编译器会对删除的移动构造函数感到非常不安。这是ideone 链接。 GCC 4.8.0 也不编译这个。
那么,是我对 std::function 的误解还是 GCC 的错误行为?
【问题讨论】:
-
刚用clang++试过,同样的问题。
-
我认为在重载决策期间仍会考虑
deleted 函数,在这种情况下,它会在复制构造函数之前被选中并导致错误。为了更正,删除移动构造函数的声明,因为用户声明的构造函数的存在不会隐式生成。此外,请参阅 this question 了解is_move_constructible信息。 -
@hmjd 是的。 stackoverflow.com/q/14085620/1171191