模板中的默认参数值 T() 如何解释?

How is default parameter value T() interpreted in a template?

本文关键字:何解释 解释 默认 参数      更新时间:2023-10-16

我遇到了这段代码,我想知道如何使用不同的数据类型解释T()

template <typename T>
class MyClass {
T _val;
std::string _message;

// constructor
MyClass(std::string const &msg, T defaultVal = T())
: _val(defaultVal), _message(msg)
{
// some code that will use msg and defaultVal
}

}

T()值初始化的一个示例。它的行为确实有所不同,具体取决于T到底是什么。直接类别如下:

值初始化的效果包括:

  1. 如果 T 是没有默认构造函数的类类型,或者具有用户提供或删除的默认构造函数,则对象默认初始化;

  2. 如果 T 是具有既非用户提供也不删除的默认构造函数的类类型(即,它可能是具有隐式定义或默认默认构造函数的类(,则对象为初始化,如果它具有非平凡的默认构造函数,则默认初始化;

  3. 如果 T 是数组类型,则数组的每个元素都是值初始化的;

  4. 否则,对象初始化为零

"默认初始化">

和"零初始化"本身就是具有确切含义的术语,必须针对所使用的确切类型确定这些术语。归根结底,C++ 中的初始化有点像兔子洞。我相信没有必要解释"零初始化"是什么意思,它只是将对象的值设置为适当的零。至于"默认初始化",定义如下:

默认初始化的效果如下:

  • 如果 T 是类类型,则考虑构造函数,并针对空参数列表进行重载解析。调用所选构造函数(默认构造函数之一(以提供新对象的初始值;

  • 如果 T 是数组类型,则数组的每个元素都是默认初始化的;

  • 否则,不执行任何操作:具有自动存储持续时间的对象(及其子对象(初始化为不确定值。

现在,举几个例子:

  1. int()- 按照上面的列表项,我们初始化要0int
  2. std::string()- 这调用std::string的默认构造函数,产生一个空字符串。