我有一个模板类,我想避免复制(因为这样做的潜在成本)。我可以实现一个移动构造函数,但我也想允许移动“跨模板参数”。这是我要编译的内容:
template <class T>
class Foo
{
public:
Foo() {}
template <class U> Foo(Foo<U>&&) {}
private:
Foo(const Foo&);
};
Foo<int> f() { Foo<float> y; return move(y); }
Foo<int> g() { Foo<int> x; return x; }
Foo<int> h() { Foo<float> z; return z; }
我理解为什么从技术上讲 f 编译:move(y) 的类型是 Foo(float)&& 并且恰好有一个方便的构造函数接受 Foo(U)&&,因此编译器设法找到 U=float 有效。
h 不编译。z 是 Foo(float) 类型,我想这离 Foo(U)&& 太远了,无法确定如果选择了 U=float 则可以调用移动构造函数......
我不知道为什么 g 编译,但确实如此。x 的类型是 Foo(int)。编译器如何设法使用移动运算符(它不能只是从 Foo(int) 隐式转换为 Foo(int)&&,可以吗?)
所以我的问题是:规则是什么?为什么 h 编译但 g 不编译?有什么我可以在 Foo 中更改以使 h 编译的吗?
谢谢