考虑
template<typename T>
struct Foo
{
Foo(const Foo&) = delete;
template <typename Y>
Foo(const Foo<Y>&){}
};
Run Code Online (Sandbox Code Playgroud)
模板构造函数的适当实例化是否代表复制构造函数?我知道它通常不会(因为复制构造函数不能是模板函数)但在这里我删除了复制构造函数.
不,它不能:重载解析始终首先考虑非模板化函数,当delete遇到 d 函数时,重载解析失败,而不是考虑模板重载。
请允许我使用以下行将默认构造函数引入到您的类中
Foo() = default;
然后,考虑两个变量
Foo<double> double_foo;
Foo<int> int_foo;
Run Code Online (Sandbox Code Playgroud)
然后注意
Foo<int> bar(double_foo);由于模板的原因允许Foo<int> bar(int_foo);delete由于d 构造函数而不允许Foo<int> bar = Foo<int>(); 如果您通过编写重新引入了移动构造函数,则将Foo(const Foo&&) = default;被允许。您需要=在此处使用语法,因为Foo<int> bar(Foo<int>());是前向声明。最后,您的断言“复制构造函数不能是模板函数”是不正确的。感谢@LightnessRacesInOrbit:
C++14 12.8.2 “类 X 的非模板构造函数是复制构造函数,如果其第一个参数的类型为 X&、const X&、易失性 X& 或 const 易失性 X&,并且没有其他参数或所有其他参数参数有默认参数 (8.3.6)。
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |