C++は単純なPOD typedefで初期化を行いますか?C++はPOD typedefの初期化を評価しますか?
Ptr()
が等しい(T*)0
に値初期化および保証を行いん
typedef T* Ptr;
と仮定すると?
Ptr p = Ptr();
return Ptr();
C++は単純なPOD typedefで初期化を行いますか?C++はPOD typedefの初期化を評価しますか?
Ptr()
が等しい(T*)0
に値初期化および保証を行いん
typedef T* Ptr;
と仮定すると?
Ptr p = Ptr();
return Ptr();
です。タイプ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には次の代替構文があります
int a{};
、これは
発現Tは非配列の完全なオブジェクトの単純型指定子(7.1.5.2)であり、T()、のように聞こえますtypedef名は、単純な型指定子ある型名であるので、タイプ又は(おそらくはCV修飾)void型は、値が初期化
指定されたタイプの右辺値を作成しますそれ自体、これはうまく動作します。
#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以外のオブジェクトを作成します(最初のものと同様の出力)。
私はこれを理解しようとしている草案の標準を熟考してきました。私はtypedefについて忘れてしまい、ポインタ型がシンプル型指定子(これはそうではない)である可能性があることを理解しようとしていましたが、今は意味があります:int *()はできませんが、 Tがint *にtypedefされている場合、T()。 –
POD以外のメンバーとPODメンバーはどうですか? –
構造体A {〜A(){} int a; };非ポッドタイプです。自分でコンストラクタを導入した場合、 "a"の値はコンストラクタが何をするかによって異なります。 –