gpt4 book ai didi

c++ - 复制构造函数……进退两难

转载 作者:行者123 更新时间:2023-11-28 00:47:37 26 4
gpt4 key购买 nike

我有一个树类,其中声明和定义了移动构造函数和移动赋值运算符。

为什么编译器会觉得需要合成一个复制构造函数然后提示 std::unique_ptr 有私有(private)成员?

这似乎适得其反。编译器是否应该不知道没有主体或根本没有定义的隐藏拷贝和赋值是为了防止尝试复制 std::unique_ptr

而且,为什么声明和定义具有空主体的复制构造函数和赋值运算符会让编译器满意?

当我继续使用此类编写和构建代码时,这会引起关注吗?

添加:

  1. 没有源码是因为没有源码错误...这是一道题
    不需要存在源代码。

  2. 当复制构造函数是私有(private)的时,编译器会报错,所以我将它们公开;将再次设为私有(private)并验证编译器是否出现故障。

  3. 我正在使用 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

最佳答案

如果没有复制构造函数,编译器将尝试生成一个。默认的复制构造函数非常笨拙,所以它会被您的类的某些部分绊倒也就不足为奇了。

定义一个空的构造函数会为您提供一个不执行任何操作的复制构造函数,这将替换编译器本来会生成的构造函数,从而避免了该问题。

关于c++ - 复制构造函数……进退两难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15681261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com