我正在尝试将vector中的所有指针初始化为NULL。 基于线程: initialize vector of pointers (automatically) 和 How to initialize a vector of pointers
我可以使用向量构造函数来实现我想要的。我的问题是:初始化NULL指针是标准行为吗?或者某些编译器中的向量中的指针可能不是NULL? 如果初始化为NULL是标准的,有人可以告诉我在哪个章节可以找到c ++标准中的相关信息吗?
谢谢,
融
答案 0 :(得分:6)
我认为你的意思是这样的:
std::vector<MyClass*> v(10);
是的,使用空指针初始化向量。按章和节引用标准有点涉及......
C ++14§23.3.6.2“向量构造函数,复制和赋值”:
explicit vector(size_type n, const Allocator& = Allocator());
效果:使用指定的分配器构造
vector
n
个默认插入元素。要求:
T
DefaultInsertable
为*this
。
§23.2.1“一般容器要求”¶13:
-
T
DefaultInsertable
进入X
意味着以下表达式格式正确:allocator_traits<A>::construct(m, p)
-
X
的元素默认插入如果通过评估表达式初始化allocator_traits<A>::construct(m, p)
其中
p
是X
内分配的元素的未初始化存储的地址。
§20.7.8.2“分配器特征成员函数”¶5:
template <class T, class... Args> static void construct(Alloc& a, T* p, Args&&... args);
效果:如果调用格式良好,则调用
a.construct(p, std::forward<Args>(args)...)
;否则,调用::new (static_cast<void*>(p)) T(std::forward<Args>(args)...)
。
§20.7.9.1“[默认] allocator
成员”¶12:
template <class U, class... Args> void construct(U* p, Args&&... args);
效果:
::new((void *)p) U(std::forward<Args>(args)...)
回到§23.2.1¶13,看到args
为空。因此...
§8.5“初始化者”:
一个对象,其初始化程序是一组空的括号,即
()
,应进行值初始化。
相同部分:
value-initialize 类型为
T
的对象意味着:...否则,该对象将被初始化为零。
相同部分:
零初始化类型
T
的对象或引用意味着:...如果T
是标量类型(3.9),则将对象初始化为获得的值将整数文字0
(零)转换为T
; 106
脚注106:
如4.10中所述,将值为
0
的整数文字转换为指针类型会产生空指针值。