“T a”、“T a()”和“T a=T()”之间有什么区别,其中 T 是一个类?

Ram*_*bie 2 c++ constructor class

T一个C++类。

以下三个指令之间的行为有什么区别吗?

T a;
T a();
T a = T();
Run Code Online (Sandbox Code Playgroud)

为不带参数的构造函数提供显式定义这一事实是否会T改变问题?

后续问题:如果为T至少带有一个参数的构造函数提供定义呢?那么以下两条指令之间的行为是否会有所不同(在本示例中,我假设构造函数仅采用一个参数)?

T a(my_parameter);
T a = T(my_parameter);
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 8

T a;执行默认初始化。

T a = T();执行值初始化。

T a();没有声明名为 的变量a。它实际上声明了一个名为 的函数a,该函数不带任何参数,其返回类型为T

这里讨论默认初始化和值初始化之间的区别。

  • 还有一个区别是“T a = T();”实际上是复制初始化。在 C++17 之前,这意味着“T”必须是可复制或可移动的。 (2认同)