以下のコードでは、Fのmove ctorが呼び出されるのはなぜですか?テンプレートコンストラクタ(std :: functionとmini case)によってコンストラクタトリガが予期せず移動する
std :: functionをラップしようとしたときに私はこの問題に遭遇し、内部ファンクタが構築中に2回移動したことに驚きました。
(G ++ 4.8.x-5.3.xを使用して)#include <iostream>
using namespace std;
struct F {
F() { cout << "F()" << endl; }
F(const F &) { cout << "F(const F &)" << endl; }
F(F &&) {
cout << "F(F &&)" << endl;
}
void operator()() { cout << "F::()()" << endl;}
};
struct I {
#if 0
// F's move ctor not invoked
I(F &&) { }
#else
// F's move ctor invoked, why?
template<typename FT, typename = void>
I(FT) { } // Simulate std::function ctor prototype
#endif
};
struct FF {
FF(F &&f) : _impl(std::move(f)) {} // [line1] Debugger show source here
I _impl;
};
int main() {
FF ff = F();
(void)ff;
cout << "----" << endl;
return 0;
}
GDBは[LINE1]によって呼び出され、予期しない移動CTORことを示しているが、私はそれを理解することができません。 誰も私にそれを説明できますか?
さらに、私の実際のケースでは(クラスIをstd :: functionに置き換えて)、内部ファンクタFを2回動かさずにラッパークラスFFを構築する方法はありますか?
これは、 'std :: forward'と転送参照の場所です。 – Danh