C ++是否在简单的POD typedef上进行值初始化?
假设
typedef T* Ptr;
确实
Ptr()
进行值初始化并保证等于(T*)0
?
e.g。
Ptr p = Ptr();
return Ptr();
答案 0 :(得分:17)
确实如此。对于类型T
,T()
值 - 初始化类型为T
的“对象”并生成右值表达式。
int a = int();
assert(a == 0);
pod-classes相同:
struct A { int a; };
assert(A().a == 0);
对于一些没有用户声明构造函数的非POD类也是如此:
struct A { ~A() { } int a; };
assert(A().a == 0);
由于你不能做A a()
(而是创建一个函数声明),boost有一个类value_initialized
,允许解决它,而C ++ 1x将具有以下替代语法< / p>
int a{};
在标准的干话中,这听起来像是
表达式T(),其中T是非数组完整对象类型的简单类型说明符(7.1.5.2)或(可能是cv限定的)void类型,它创建指定类型的rvalue,这是价值初始化的
由于typedef-name是一个类型名称,它本身就是一个简单类型说明符,因此效果很好。
答案 1 :(得分:2)
#include <iostream>
struct Foo {
char bar;
char baz;
char foobar;
// the struct is a POD
//virtual void a() { bar='b'; }
};
int main() {
Foo o1;
Foo o2 = Foo();
std::cout << "O1: " << (int)o1.bar <<" "<< (int)o1.baz <<" "<< (int)o1.foobar << std::endl;
std::cout << "O2: " << (int)o2.bar <<" "<< (int)o2.baz <<" "<< (int)o2.foobar << std::endl;
return 0;
}
输出:
O1:-27 -98 0
O2:0 0 0
Adding()将初始化程序调用传播给所有POD成员。取消发布虚拟方法会将输出更改为:
O1:-44 -27 -98
O2:-71 -120 4
然而,添加析构函数~Foo()并不会抑制初始化,尽管它会创建非POD对象(输出类似于第一个)。