模板中的默认参数值 T() 如何解释?
How is default parameter value T() interpreted in a template?
我遇到了这段代码,我想知道如何使用不同的数据类型解释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
到底是什么。直接类别如下:
"默认初始化">值初始化的效果包括:
如果 T 是没有默认构造函数的类类型,或者具有用户提供或删除的默认构造函数,则对象默认初始化;
如果 T 是具有既非用户提供也不删除的默认构造函数的类类型(即,它可能是具有隐式定义或默认默认构造函数的类(,则对象为零初始化,如果它具有非平凡的默认构造函数,则默认初始化;
如果 T 是数组类型,则数组的每个元素都是值初始化的;
否则,对象初始化为零。
和"零初始化"本身就是具有确切含义的术语,必须针对所使用的确切类型确定这些术语。归根结底,C++ 中的初始化有点像兔子洞。我相信没有必要解释"零初始化"是什么意思,它只是将对象的值设置为适当的零。至于"默认初始化",定义如下:
默认初始化的效果如下:
如果 T 是类类型,则考虑构造函数,并针对空参数列表进行重载解析。调用所选构造函数(默认构造函数之一(以提供新对象的初始值;
如果 T 是数组类型,则数组的每个元素都是默认初始化的;
否则,不执行任何操作:具有自动存储持续时间的对象(及其子对象(初始化为不确定值。
现在,举几个例子:
int()
- 按照上面的列表项,我们初始化要0
int
。std::string()
- 这调用std::string
的默认构造函数,产生一个空字符串。
相关文章:
- 请解释"函数1(p1,p2,p3);"的输出
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 被解释为低级别const的const对象的地址
- 计算每个节点的树高,帮助我解释这个代码解决方案
- MSVC将仅移动结构参数解释为指针
- 内联程序集printf将整数解释为地址
- 有人能解释一下为什么下界是这样工作的吗C++的
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 有人能为我解释一下C++代码吗
- 你能解释一下什么运行时错误是如何解决它的吗?
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- 有人可以向我解释为什么控制台输出 0 吗?
- 有人可以解释一下这段代码如何能够反转字符串
- 在 C++ 中解释多维向量的语句时感到困惑
- 解释一下 for (char c : str) 的作用?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 隐式重新解释引用时强制转换,没有警告/错误
- 有人可以在 c++ 中解释数组的这种输入
- 有人可以解释一下这个矩阵幂函数是如何工作的吗?