请问C ++对简单的POD typedef执行值初始化吗?
假设
typedef T* Ptr;
做
Ptr()
您希望进行值初始化并保证等于(T*)0
吗?
例如:
Ptr p = Ptr();
return Ptr();
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将提供以下替代语法。
int a{};
由于typedef名称是类型名称,本身就是简单类型说明符,因此这个过程完全可行。表达式T(),其中T是一个简单类型说明符(7.1.5.2),用于非数组完整对象类型或(可能带有cv限定符的)void类型,创建指定类型的rvalue,该rvalue被值初始化。
#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
添加 () 将初始化调用传播到所有 POD 成员。取消注释虚拟方法将更改输出为:
O1: -44 -27 -98
O2: -71 -120 4
然而,添加析构函数 ~Foo() 并不会抑制初始化,尽管它创建了非 POD 对象(输出类似于第一个对象)。