6

検討中

struct C { 
   C()            { printf("C::C()\n"          ); }
   C(int)         { printf("C::C(int)\n"       ); }
   C( const C& )  { printf("copy-constructed\n"); }
};

そしてテンプレート機能

template< typename T > void foo(){
    // default-construct a temporary variable of type T
    // this is what the question is about.
    T t1;       // will be uninitialized for e.g. int, float, ...
    T t2 = T(); // will call default constructor, then copy constructor... :(
    T t3();     // deception: this is a local function declaration :(
}

int main(){
    foo<int>();
    foo<C  >();
}

を見ると、例えばのt1場合は初期化されません。一方、一時的に構築されたデフォルトからコピー構築されます。Tintt2

質問: C++ では、template-fu を使用する以外に、ジェネリック変数をデフォルトで構築することは可能ですか?

4

4 に答える 4

5

ローカルクラスを使用して使用できるトリックは次のとおりです。

template <typename T> void foo() {
    struct THolder {
        T obj;
        THolder() : obj() { } // value-initialize obj
    };

    THolder t1; // t1.obj is value-initialized
}

このトリックについては、別のStack Overflowの質問への回答から読んだと思いますが、現時点ではその質問を見つけることができません。

または、クラステンプレートを使用することもできますboost::value_initialized<T>。これは、基本的に同じことを行い、柔軟性と一貫性を高め、バグのあるコンパイラの回避策を提供します。

C ++ 0xでは、はるかに簡単です。空の初期化子リストを使用できます。

T obj{}; // obj is value-initialized

(私の知る限り、gcc4.5+のみがC++0x初期化子リストをサポートしています。ClangおよびVisualC++はまだそれらをサポートしていません。)

于 2011-03-14T18:55:31.130 に答える
2

コピーコンストラクターが存在しなければならないという事実を気にせず、単に呼び出されないようにしたい場合:

心配しないでください。この状況では、コピー コンストラクターの呼び出し省略されます。最適化を無効にしてコンパイルした場合でも( ) 、常に確実に実行されます-O0

于 2011-03-14T19:05:47.633 に答える
0

T t2 = T(); //デフォルトのコンストラクターを呼び出してから、コンストラクターをコピーします... :(

私のコンパイラ(VC2008)ではありません。私にとっての出力は...

C::C()
C::C()

それは私がそれがすることを期待することです。私は何かが足りないのですか?

于 2011-03-14T19:00:12.203 に答える
0

あなたの本当の質問は何ですか?デフォルトのコンストラクターはt1インスタンスに対して呼び出されます。

于 2011-03-14T18:56:12.587 に答える