我有一个树类,它具有移动构造函数和移动赋值运算符声明和定义。复制构造函数...一个困惑
为什么编译器会觉得需要合成一个拷贝构造函数,然后抱怨std::unique_ptr
有私有成员?
这似乎适得其反。编译器是否应该意识到隐藏的副本和任务没有主体或者没有定义是为了防止尝试复制std::unique_ptr
?
而且,为什么声明和定义具有空体的复制构造函数和赋值运算符会使编译器感到高兴?
在我继续使用这个类编写和构建代码时,这会引起关注吗?
附加:
没有源代码,因为没有源代码中的错误......这是一个问题
不需要的源代码存在。编译器抱怨拷贝构造函数是私人的,所以我把它们公开; 将再次私有并验证编译器是否支持小应用程序。
我使用的是Visual Studio 2012 Professional IDE及其相关的编译器。
为什么编译器在存在移动构造函数时会生成复制构造函数?似乎违反直觉,特别是如果复制构造函数没有在第一个地方定义。
其它问题:
好吧,看来的Visual Studio 2012不支持=在构造函数或赋值操作符和隐藏我的声明导致编译器在我的代码全部删除哭声明。现在我该怎么做?我同意(下文)宣布不做任何事情的拷贝构造函数是个坏主意,那么我还有其他什么选择?
如果真的需要小例子,这里是。我的编译器不支持=删除
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 ::变种与此
请显示您的C++源代码(或与其等效的小示例) –
编译器只会在您实际尝试复制或复制分配时抱怨,这是非常合理的。 – juanchopanza
如果你想确保没有人使用复制构造函数和赋值操作符,你可以将它们定义为private或(=在C++ 11中删除) – kalvis