2009-05-25 24 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對象(輸出與第一個類似)。