考虑以下代码:
#include <memory>
#include <vector>
class A
{
private:
std::vector<std::unique_ptr<int>> _vals;
};
int main()
{
A a;
//A a2(a);
return 0;
}
编译器 A 编译它没有问题,除非我取消注释掉A a2(a);它抱怨复制构造函数std::unique_ptr被删除的行,因此我不能复制构造A。然而,即使我将该行注释掉,编译器 B 也会发出这种抱怨。也就是说,编译器 A 仅在我实际尝试使用它时生成一个隐式定义的复制构造函数,而编译器 B 无条件地这样做。哪一个是正确的?请注意,如果我正确地使用std::unique_ptr<int> _vals;而不是std::vector<std::unique_ptr<int>> _vals;两个编译器,则隐式删除复制构造函数和赋值运算符(std::unique_ptr具有显式删除的复制构造函数,而std::vector没有)。
(注意:让代码在编译器 B 中编译很容易 - 只需显式删除复制构造函数和赋值运算符,它就可以正常工作。这不是问题的重点;它是为了理解正确的行为。)