【发布时间】:2018-06-21 17:26:06
【问题描述】:
考虑以下代码:
#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 中编译很容易 - 只需显式删除复制构造函数和赋值运算符,它就可以正常工作。这不是问题的重点;它是为了理解正确的行为.)
【问题讨论】:
-
编译器B是哪个编译器?随意使用您正在使用的编译器的真实名称。
-
我无法使用任何英特尔编译器进行复制here...您使用的是非常旧的版本吗?
-
编译器不应该给你一个评论错误。如果是这样,它就有一个错误。
-
@R_Kapp 这应该是问题中的信息。您的“mvce”并不代表您实际在做什么。
-
因为它只在使用
__declspec(dllexport)时发生,所以它应该是 MCVE 的一部分。 (特别是如果声明一个用于导出的类可能会导致其隐式定义的构造函数被实例化为 DLL 接口。)
标签: c++ c++11 language-lawyer copy-constructor assignment-operator