C++是否對簡單的POD typedefs做初始化值?C++是否確定了POD typedef的初始化值?
假設
typedef T* Ptr;
確實
Ptr()
做值初始化並保證平等(T*)0
?
例如
Ptr p = Ptr();
return Ptr();
C++是否對簡單的POD typedefs做初始化值?C++是否確定了POD typedef的初始化值?
假設
typedef T* Ptr;
確實
Ptr()
做值初始化並保證平等(T*)0
?
例如
Ptr p = Ptr();
return Ptr();
它的確如此。對於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,它是一個簡單類型說明符本身,這工作得很好。
#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對象(輸出與第一個類似)。
我一直在研究草案標準,試圖解決這個問題。我忘記了typedef,並試圖弄清楚指針類型是一個簡單類型說明符(它不是),現在它是有道理的:你不能做int *(),但你可以做T()如果T被定義爲int *。 – 2009-05-25 13:58:23