gpt4 book ai didi

c++ - 删除复制构造函数和 operator= 类作用域访问

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:54 24 4
gpt4 key购买 nike

在旧版本的 C++ 中,如果想要阻止类对象的复制,他们通常会声明Copy Constructoroperator=() 在类的私有(private)部分中:

class Foo {
public:
Foo(){} // Default
~Foo(){} // Default

private:
Foo( const Foo& c ); // not implemented
Foo& operator=( const Foo& c ); // not implemented
};

这很简单。现在有了更新版本的 C++,我们现在可以改为执行此操作。

class Foo {
public:
Foo() = default;
~Foo() = default;
private:
Foo( const Foo& c ) = delete;
Foo& operator=( const Foo& c ) = delete;
};

然后我的问题变成了:使用将这些声明为 deleted 函数的现代方法,如果它们在其类的公共(public)、 protected 或私有(private)部分中定义,是否重要或有任何区别?


例如上面那个和这个有什么区别吗:

class Foo {
public:
Foo() = default;
~Foo() = default;
Foo( const Foo& c ) = delete;
Foo& operator=( const Foo& c ) = delete;
};

编辑:

我接受了 ShadowRanger 的回答,因为他们用示例进行了解释,并提供了指向此 Q/A 的链接。清楚地解释了建议及其原因......

我注意到,在第一个示例中,当它们被声明为 private 时,您将在已经存在的 compiler 错误之上得到额外的 compiler errors 在声明为 public 时已经生成。

最佳答案

It has been recommended that the deleted function be public如果只是为了简化错误消息。例如,在 gcc 上,当删除的复制构造函数被声明为 private 时,错误消息会更加冗长,而实际上并没有提供更多信息,例如在 g++ 7 上,无论哪种方式你都会得到这个错误:

deleted_copy.cpp:5:10: error: use of deleted function ‘A::A(const A&)’
A b = a;
^
In file included from deleted_copy.cpp:1:0:
deleted_copy.h:6:5: note: declared here
A(const A&) = delete;
^

但是如果复制构造函数是private,你还会得到(在上面给出的错误之上;关于复制构造函数被删除的错误是最后一个):

deleted_copy.cpp: In function ‘int main()’:
deleted_copy.cpp:5:10: error: ‘A::A(const A&)’ is private within this context
A b = a;
^
In file included from deleted_copy.cpp:1:0:
deleted_copy.h:6:5: note: declared private here
A(const A&) = delete;
^

在这两种情况下,deleted_copy.cpp 是:

#include "deleted_copy.h"

int main() {
A a;
A b = a;
}

我的 deleted_copy.h 是:

class A
{
public:
A() = default;
private:
A(const A&) = delete;
};

在测试它如何作为public 时注释掉private 行。

关于c++ - 删除复制构造函数和 operator= 类作用域访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48412615/

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