4
#include <iostream> 

struct A { 
    int x; 
}; 

void foo(A a) { 
    std::cout << a.x << std::endl; 
} 

int main() { 
    A a; 
    foo(a); // -7159156; a was default-initialized 
    foo(A()); // 0; a was value-initialized 
} 

値初期化、それをせずにfoo()にタイプAの右辺値を渡すことが可能ですか?値の初期化と左辺値のどちらを使用する必要がありますか?右辺値としてデフォルトの初期化(NOT値/ゼロ初期化)PODを取得

値の初期化を避けることのポイントは、10ナノ秒を超えないようにすることです。このような状況はどうですか:valgrindを使用した初期化されていないメモリアクセスによるレガシーアプリのバグを探しています。ゼロはアプリの有効な値とはみなされません。値を初期化すると、初期化されていないメモリアクセスの場所を特定することができなくなります。

初期化されていない値を印刷するのはUBですが、実際の使用例は印刷に限定されません。私の質問はそれがなければ有効なままです。

+0

初期化されていないクラスメンバーは動作を定義していますか? –

+1

'A 'はPODであるためにすべてのボックスにチェックを入れなければなりませんか?空のユーザ提供のデフォルトのコンストラクタを与えることができれば、値の初期化はデフォルトの初期化と実質的に等しくなり、あなたは未定義の動作を得ます;-)。 – bogdan

+0

@bogdan「A」は私のコントロール外になる可能性があります。例えば。 'struct tm' – nodakai

答えて

1

質問が正しく理解された場合、foo(A());などの代替品が必要です。A()が呼び出され、メンバーのデフォルト初期化が行われない場合があります。ここではその場合、一つの

は私が思い付いたものです:私は A() = defaultを追加しようとしました

  • まず(これは古いC++の規格では動作しない場合があります)と私はinteresting resultsを持っていました。あなたが提供した正確なサンプルは、最初に0を反転印刷してから乱数を反転させて出力します。

  • 第二に、私はあなたがfoo(make<A>())のようにそれを使用すると、あなたが望む結果を得ることができますA() = default;を使用して、ちょうどテンプレート機能を使用

    template <class T> T make() { T tmp; return tmp; } 
    

    をコピーの費用で(または移動)しませんでした。

関連する問題