【发布时间】:2014-04-05 13:33:52
【问题描述】:
template <typename T>
class A {
public:
template<class C> A(const A<C>&) {}
A(A&&) {}
};
void f(A<int>& a)
{
A<int> b(a);
}
上述代码在 g++/clang++ 中无法编译,报告复制构造函数被删除,因为用户提供了移动构造函数(尽管 vc++ 编译正常)。是否有任何标准要求阻止在重载解析期间选择模板构造函数(但我知道它不是复制构造函数)?或者有没有要求当initializer和initializee的类型相同时,必须选择一个拷贝构造函数?
【问题讨论】:
-
A(A&&) {}我觉得应该有单&。 -
@juanchopanza:谢谢!这消除了我的疑问。
-
@ShashwatKumar:不,问题的关键在于声明移动构造函数 (
&&) 会删除复制构造函数。声明一个复制构造函数(&,通常带有const)显然不会。
标签: c++ templates constructor language-lawyer