如果 class 未初始化,C++ 编译器会生成 def ctor 吗?
Do C++ compilers generate a def ctor if the class was not initialized?
我写了一个实用程序 class(我猜是作为助手 class),它只有几个 static 成员函数可以使用在另一个 class 中。它没有任何非静态成员(变量或函数)。所以它也没有任何 explicit ctors 或 dtor.
问题是,我的编译器(GCC v11.2 和 -std=c++20)是否仍会为实用程序生成 隐式默认构造函数和 dtor class?如果是这样,那么我应该如何防止它这样做?因为我还没有在我的代码中初始化 class 的任何实例。
(我稍微回避了你的问题,而不是主动提供建议)如果你有一个 static
函数的集合并且你的 class 不需要任何状态
class Example
{
public:
static void Foo();
static int Bar();
};
那么您一开始就应该不使用 class
,而这些可能应该是命名空间中的自由函数
namespace Example
{
void Foo();
int Bar();
}
仍然允许您将它们调用为 Example::Foo()
和 Example::Bar()
但现在您不必担心有人试图实例化您的“class”,因为那不是什么你打算设计它。
如前所述,您应该为此类上下文使用命名空间。话虽这么说,要回答你的问题,答案是“不是真的”。编译器必须“创建”一个,但不必为其生成代码。
我在标准中找不到任何明确说明这一点的内容,但是,如果您创建一个只有静态函数的简单 class,并查看生成的汇编代码,您会发现没有创建构造函数。即使您尝试使用自动或动态变量实例化该对象,也不会生成任何代码。简而言之,由于默认构造函数甚至无法执行任何操作,因此编译器没有理由生成任何代码。
您可以使用启用了 C++20 的 gcc 11.2 查看此 here。请注意,我关闭了优化,只是为了表明不是 -O3
删除了调用。
我写了一个实用程序 class(我猜是作为助手 class),它只有几个 static 成员函数可以使用在另一个 class 中。它没有任何非静态成员(变量或函数)。所以它也没有任何 explicit ctors 或 dtor.
问题是,我的编译器(GCC v11.2 和 -std=c++20)是否仍会为实用程序生成 隐式默认构造函数和 dtor class?如果是这样,那么我应该如何防止它这样做?因为我还没有在我的代码中初始化 class 的任何实例。
(我稍微回避了你的问题,而不是主动提供建议)如果你有一个 static
函数的集合并且你的 class 不需要任何状态
class Example
{
public:
static void Foo();
static int Bar();
};
那么您一开始就应该不使用 class
,而这些可能应该是命名空间中的自由函数
namespace Example
{
void Foo();
int Bar();
}
仍然允许您将它们调用为 Example::Foo()
和 Example::Bar()
但现在您不必担心有人试图实例化您的“class”,因为那不是什么你打算设计它。
如前所述,您应该为此类上下文使用命名空间。话虽这么说,要回答你的问题,答案是“不是真的”。编译器必须“创建”一个,但不必为其生成代码。
我在标准中找不到任何明确说明这一点的内容,但是,如果您创建一个只有静态函数的简单 class,并查看生成的汇编代码,您会发现没有创建构造函数。即使您尝试使用自动或动态变量实例化该对象,也不会生成任何代码。简而言之,由于默认构造函数甚至无法执行任何操作,因此编译器没有理由生成任何代码。
您可以使用启用了 C++20 的 gcc 11.2 查看此 here。请注意,我关闭了优化,只是为了表明不是 -O3
删除了调用。