繁体   English   中英

带外部定义的默认特殊成员 function

[英]Defaulted special member function with external definition

我想声明一个带有默认构造函数1class ,但我希望这个默认构造函数是“外部”,因为构造函数主体应该只编译一次,当 class 的 TU 被编译时,而不是在每个包含该 header 的 TU。 最后,不应看到 class 具有用户提供的构造函数,而是默认的构造函数2

例如,这是一种尝试:

foo.hpp:

class Foo {
public:
  Foo();
};

foo.cpp:

Foo::Foo() = default;

这会导致默认的构造函数实现,但这意味着Foo有一个用户提供的构造函数,这会影响类型的特征,例如,它是否微不足道等。

这是另一种方式:

foo.hpp:

class Foo {
public:
  Foo() = default;
};

这保留了“非用户提供”属性,但现在每个包含此 class 并使用构造函数的 TU 都将为它生成机器代码(并且此代码可能会被内联等)。


1真的,这适用于任何特殊的成员函数,但为了具体起见,我在这里使用默认构造函数。

2 class 是否有用户提供的构造函数会影响 class 的各种重要特征和行为,例如是否具有普通构造函数,是否隐式删除其他特殊成员函数等。

语言中没有办法告诉编译器 function 是非用户提供的(“你知道关于它的一切”),同时还声称它是不透明的(“你不能在这里进行代码生成”)。 幸运的是,C++20模块的明显实现策略具有这种效果:在模块接口单元中默认为 class 的成员 function 将被考虑在任何地方进行内联,但显然只需要在 ZA8CFDE63931BD59EB62AC9ZF 生成的文件中生成一个外联副本。为模块。

如果您想要比这更强大的保证,那么您已经进入了特定于实现的领域,并且您应该研究特定于编译器的属性来管理代码生成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM