我有一个树类,它声明和定义了移动构造函数和移动赋值运算符。
为什么编译器会觉得需要合成一个复制构造函数,然后抱怨std::unique_ptr
有私有成员?
这似乎适得其反。编译器是否应该不知道没有正文或根本未定义的隐藏副本和赋值是为了防止尝试复制 a std::unique_ptr
?
而且,为什么用空主体声明和定义复制构造函数和赋值运算符会使编译器高兴?
当我继续使用这个类编写和构建代码时,这是否会引起关注?
补充:
没有源代码,因为没有源代码错误……这是一个
不需要源代码存在的问题。当复制构造函数是私有的时编译器会抱怨,所以我将它们公开;将再次设为私有并验证编译器是否存在问题。
我正在使用 Visual Studio 2012 Professional IDE 及其相关的编译器。
为什么编译器在存在移动构造函数的情况下生成复制构造函数?似乎违反直觉,特别是如果没有在第一处定义复制构造函数。
附加问题:
好吧,Visual Studio 2012 似乎不支持 = delete 构造函数或赋值运算符的声明,隐藏我的声明会导致编译器在我的代码中哭泣。现在我该怎么做?我同意(如下)声明不做任何事情的复制构造函数是个坏主意,那么我还有什么其他选择?
如果真的想要小例子,这里就是。我的编译器不支持 = delete
class Tree{
class TreeNode{
"declaration of unique_ptr, cstrs, move cstrs, hidden copy cstrs"
};
public:
"declaration of unique_ptrs, cstrs, move cstrs, copy cstrs <----- compiler
complains if hidden"
};
对此使用 boost::variant