RDLC Report
如果template <typename T>
class myclass {
public:
myclass();
private:
T value;
};
template <typename T>
myclass<T>::myclass() : value(T()) {}
是指针(例如T
),那么默认值(int*
)是多少?是int*()
还是纯零?这种情况有什么不同吗?
答案 0 :(得分:4)
那么默认值是多少?是nullptr还是普通零?
然后指针是空指针。在这种情况下,nullptr
和0
可以互换。
答案 1 :(得分:2)
是
nullptr
还是纯零?这种情况有什么不同吗?
您正在使用的初始化语法称为value initialization。对于指针,它与zero initialization相同。因此,当T
为int*
时,您的代码等同于
template <typename T>
myclass<T>::myclass() : value(T(0)) {}
这种情况有什么不同吗?
不,没有。
答案 2 :(得分:1)
Per cppreference.com:
语法
T();
(1)
...在以下情况下执行值初始化:
1,5)创建无名临时对象时,初始化程序由一对空括号[或大括号(自C ++ 11)]组成];
...值初始化的影响是:
1)如果T是具有至少一个用户提供的任何类型构造函数的类类型,则调用默认构造函数; (直到C ++ 11)
1)如果T是没有默认构造函数的类类型,或者是用户提供或删除的默认构造函数,则该对象是默认初始化的; (自C ++ 11起)
2)如果T是不带任何用户提供的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的; (直到C ++ 11)
2)如果T是具有默认构造函数的类类型,该构造函数既不是用户提供也不是删除(也就是说,它可能是具有隐式定义或默认默认构造函数的类),该对象是零初始化的并且如果它有一个非平凡的默认构造函数,那么它是默认初始化的; (自C ++ 11起)
3)如果T是数组类型,则数组的每个元素都是值初始化的;
4)否则,该对象为零初始化。
语法
T();
(2)
...在以下情况下执行零初始化:
...
2)作为非类类型的值初始化序列的一部分,以及没有构造函数的值初始化类类型的成员,包括没有提供初始值设定项的聚合元素的值初始化。
...零初始化的影响是:
如果T是标量类型,则对象的初始值是显式转换为T的整数常量零。
如果T是非联合类类型,则所有基类和非静态数据成员都是零初始化的,并且所有填充都初始化为零位。构造函数(如果有)将被忽略。
如果T是并集类型,则第一个非静态命名数据成员将进行零初始化,并将所有填充初始化为零位。
如果T是数组类型,则每个元素都是零初始化
如果T是引用类型,则不执行任何操作。
这意味着当T
任何指针类型(例如:int*
)时,T()
将0
转换为{{1} (例如:T
)。在C ++ 11及更高版本中,这相当于static_cast<int*>(0)
,因为文字nullptr
可以隐式转换为指针类型,与0
相同。