と仲良くしようとしていstd::function
ます。ここの参照から、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
。しかし、コメント行のコメントを外すと、コンパイラは削除された移動コンストラクターについて非常に動揺します。ここにアイデアリンクがあります。GCC 4.8.0 もこれをコンパイルしません。
それで、それは私が誤解しているものですか、std::function
それともGCCの間違った動作ですか?