CはPOD typedefの値の初期化をしますか?

c++ pointers
CはPOD typedefの値の初期化をしますか?

Cは単純なhttps://stackoverflow.com/questions/ 14 64 52 / [POD] typedefで値の初期化を行いますか?

想定して

typedef T* Ptr;

does

Ptr()

値の初期化を行い、 `+(T *)0 +`と等しいことを保証しますか?

e.g.

Ptr p = Ptr();
return Ptr();

  9  7


ベストアンサー

します。 タイプ「+ 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にはクラスhttp://www.boost.org/doc/libs/1_39_0/libs/utility/value_init.htm[+ value_initialized + `]、それを回避できるようにし、C ++ 1xには次の代替構文があります。

int a{};

標準の乾燥した言葉では、これはのように聞こえます

_
式T()(Tは非配列完全オブジェクト型の単純型指定子(7.1.5.2)または(おそらくcvで修飾された)void型)は、指定された型の右辺値を作成します-初期化済み
_

typedef-nameは単純な型指定子そのものであるtype-nameなので、これはうまく機能します。

17


#include
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
__

Adding()はイニシャライザ呼び出しをすべてのPODメンバに伝播します。 仮想メソッドを無視すると、出力は次のように変わります。

__
O1:-44-27-98

O2:-71-120 4
__

ただし、デストラクタ〜Foo()を追加しても初期化は抑制されませんが、非PODオブジェクト(最初のオブジェクトと同様の出力)が作成されます。

2


タイトルとURLをコピーしました