【发布时间】:2021-01-01 01:22:50
【问题描述】:
为什么下面的代码编译失败(抱怨删除了拷贝构造函数):
struct C {
int i;
C(const C&) = delete;
C(int i) : i(i) {}
template <typename T>
C(const T& value) {
cout << "in templatized constructor!\n";
this->i = value.i * 2;
}
};
int main()
{
C s1{4};
C s2{s1};
cout << s2.i;
}
但是当我从模板化复制构造函数中删除 const 时,一切正常:
template <typename T>
C(T& value) {
cout << "in templatized constructor!\n";
this->i = value.i * 2;
}
两个问题:
(1) 生成的复制构造函数被删除时,为什么不使用模板构造函数作为后备?
(2) 即使“模板不能是复制构造函数” - C(T&); 如何/为什么构造函数被用作复制构造函数(在第二个示例中)?这肯定与模板不能是复制构造函数的想法相矛盾吗?
【问题讨论】:
-
线索:尝试声明
const C s1{4};,看看是否“一切正常”。剧透:它没有。 -
模板永远不是复制构造函数。
-
没有模板化复制构造函数之类的东西。复制构造函数永远不是模板。模板永远不是复制构造函数。
-
顺便说一句,这究竟是为什么?在第一种情况下,最佳匹配是删除的函数。在第二种情况下,最佳匹配是模板。
-
"隐式生成的复制构造函数已被删除,为什么不回退" 因为
= delete并不意味着“假装我不在这里”。它的意思是“我在这里,但不要试图给我打电话”。