防止复制构造函数实例化 C++11 类"deleting"

Prevent instantiation of C++11 class by "deleting" copy constructor

本文关键字:deleting C++11 实例化 复制 构造函数      更新时间:2023-10-16

我想在 C++11 中创建一个"静态类",即一个只有静态方法且无法实例化或继承的类。 提出了以下解决方案:

class Foo final {
public:
static void methodA(...);
static int methodB(...);
Foo(const Foo&) = delete;
};

这样,编译器既不会创建默认值,也不会创建复制构造函数。Visual Studio的IntelliSense也证实了这一点,因为它在键入Foo(时不提供任何构造函数自动完成。

我想知道这个解决方案是否比使默认构造函数私有的"通用"方法更可取。有什么优点/缺点吗?

将 ctor 设为私有的区别在于,这用于不允许您使用= delete的旧C++标准。执行此操作的旧形式不那么"干净",因为它依赖于链接器而不是编译器来提供错误消息。如果你的 ctor 是私有的并且没有定义,但你仍然调用它(例如,从类函数中(,链接器将负责中止生成过程并出现错误(因为 ctor 只是声明的,而不是定义的。= delete形式更简洁,因为编译器现在可以直接发出错误。

但是,您在这里追求的内容与命名空间非常相似。所以我建议你这样做:

namespace Foo {
void methodA(...);
int methodB(...);
}

这不会更改用于调用函数的完全限定形式。像以前一样,您用Foo::methodA()调用methodA(),因此这应该充当直接替换。

如果需要,您还可以使用using语句删除Foo::。例如:

using Foo::methodA;
methodA(); // Valid call.

或者只是using Foo;将所有标识符从Foo引入当前范围,而不必在其中任何一个前面加上Foo::.(通常的警告适用于此处关于命名空间污染的问题。

不能使用静态类函数执行此操作。

看起来你用错了工具来完成这项工作,namespace(根据@jamesdlin的评论(会做你想做的事:

namespace Foo {
void methodA(...);
int methodB(...);
};