2

私はこれと同様の問題に直面しています。

int j = 6;
int *k = new int[j]{4};

警告は:

warning: non-constant array size in new, unable to verify length 
of initializer-list [enabled by default]

警告のみが表示され、エラーは発生せず、-std = gnu++11で実行します。

さらに、すべてのインスタンスに対してコンストラクターを呼び出す必要があります。配列の値を出力すると、すべて

4

2 に答える 2

5

問題はまさにコンパイラがあなたに伝えていることです。

ディメンションは実行時にのみ認識されるため、次のような実行時機能のみを使用できます。

std::vector<int> v(j, 4);
// `v` contains `j` ints, all initialised to `4`

デフォルトで構築できない要素タイプがある場合は、要素をその場で構築できます。

std::vector<T> v;
v.reserve(j);
for (size_t i = 0; i < j; i++)
   v.emplace_back(ctor-args-here);

おそらく初期化リストを使用することもできます。

std::vector<T> v{
   T(ctor-args-here), T(ctor-args-here), T(ctor-args-here),
   T(ctor-args-here), T(ctor-args-here), T(ctor-args-here)
};

オブジェクトは移動されるか、最悪の場合はコピーされます。

ここでのポイントは、ベクトル要素がデフォルトで構築可能である必要はないということです。

(残念ながら、ループやコードの繰り返しなしでこれを行う方法を知りません。)

于 2013-02-05T17:10:18.780 に答える
2

私の知る限り、C++11標準のセクション8.5/16では、クラス型の配列のすべての要素を均一に初期化するためにユーザー定義のコンストラクターを呼び出す可能性がほとんどありません。関連するテキストは次のとおりです(関連性がないと思われるリストされた項目をいくつか切り取りました)。

初期化子のセマンティクスは次のとおりです。デスティネーションタイプは初期化されるオブジェクトまたは参照のタイプであり、ソースタイプは初期化式のタイプです。初期化子が単一の(場合によっては括弧で囲まれた)式でない場合、ソースタイプは定義されていません。

—初期化子が(括弧で囲まれていない)braced-init-listの場合、オブジェクトまたは参照はリスト初期化されます(8.5.4)。

—初期化子が()の場合、オブジェクトは値で初期化されます。

—それ以外の場合、宛先タイプが配列の場合、プログラムの形式が正しくありません。

于 2013-02-05T17:23:26.683 に答える