2009-05-25 52 views

回答

17

它的确如此。对于T类型,T()值 - 初始化类型为T的“对象”并生成右值表达式。

int a = int(); 
assert(a == 0); 

同为豆荚类:

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{}; 

在标准的干的话,这听起来像

表达T(),其中T是一个简单的类型说明符(7.1.5.2)用于非阵列的完整对象类型或(可能是cv-qualified)void类型创建一个指定类型的右值,该值是初始化的

由于typedef-name是一个type-name,它是一个简单类型说明符本身,这工作得很好。

+3

我一直在研究草案标准,试图解决这个问题。我忘记了typedef,并试图弄清楚指针类型是一个简单类型说明符(它不是),现在它是有道理的:你不能做int *(),但你可以做T()如果T被定义为int *。 – 2009-05-25 13:58:23

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

添加()传播初始化调用所有POD成员。 Uncomenting虚拟方法改变输出到:

O1:-44 -27 -98

O2:-71 -120 4

然而添加的析构函数〜美孚()不抑制初始化,尽管它创建了非POD对象(输出与第一个类似)。