2009-05-25 6 views

答えて

17

です。タイプTの場合、T()は、タイプTの「オブジェクト」を値で初期化し、rvalue式を生成します。

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

そのためのポッドクラス:

struct A { ~A() { } int a; }; 
assert(A().a == 0); 

は、あなたが(A a()を行うことはできませんので、作成しています。何のユーザーを持っていないいくつかの非PODクラスのも

struct A { int a; }; 
assert(A().a == 0); 

真は、コンストラクタを宣言しました関数の宣言ではなく)、ブーストにはクラスvalue_initializedがあり、これを回避することができます.C++ 1xには次の代替構文があります

0標準のドライすなわち
int a{}; 

、これは

発現Tは非配列の完全なオブジェクトの単純型指定子(7.1.5.2)であり、T()、のように聞こえますtypedef名は、単純な型指定子ある型名であるので、タイプ又は(おそらくはCV修飾)void型は、値が初期化

指定されたタイプの右辺値を作成しますそれ自体、これはうまく動作します。

+3

私はこれを理解しようとしている草案の標準を熟考してきました。私はtypedefについて忘れてしまい、ポインタ型がシンプル型指定子(これはそうではない)である可能性があることを理解しようとしていましたが、今は意味があります:int *()はできませんが、 Tがint *にtypedefされている場合、T()。 –

+0

POD以外のメンバーとPODメンバーはどうですか? –

+0

構造体A {〜A(){} int a; };非ポッドタイプです。自分でコンストラクタを導入した場合、 "a"の値はコンストラクタが何をするかによって異なります。 –

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

(追加)すべてのPODのメンバーに初期化コールを伝播します。 Uncomenting仮想メソッドが出力を変更します。

O1:-44 -27 -98

O2:-71 -120 4

しかしデストラクタ〜Fooの()を追加することは抑制されません。 POD以外のオブジェクトを作成します(最初のものと同様の出力)。

関連する問題