はい、初期化リストのメンバ関数の使用は有効で、標準に準拠しています。
データメンバーは、宣言の順番で初期化されます(これは、宣言の順番に初期化リストに表示される理由です)。 N_
が最初に初期化され、このデータメンバーをfill_arr
に渡すことができました。 fill_arr
はコンストラクタの前に呼び出されますが、この関数は初期化されていないデータメンバーにアクセスしないため(データメンバーにはまったくアクセスしません)、その呼び出しは安全とみなされます。ここで
C++標準の最新ドラフト(N3242 = 11から0012)からいくつかの関連exceptsである:
は12.6.2.13条:(仮想メンバ関数を含む、 10.3)メンバ関数を呼び出すことができます(...)ただし、これらの操作がctor-initializer(またはctor-initializerから直接的または間接的に呼び出される関数 )で実行される場合、基本クラスのmem-initializersにはすべて、完了した場合、 操作の結果は未定義です。例:
class A { public: A(int); };
class B : public A {
int j;
public:
int f();
B() : A(f()), // undefined: calls member function
// but base A not yet initialized
j(f()) { } // well-defined: bases are all initialized
};
class C {
public:
C(int);
};
class D : public B, C {
int i;
public:
D() : C(f()), // undefined: calls member function
// but base C not yet initialized
i(f()) { } // well-defined: bases are all initialized
};
§12.7.1:非自明なコンストラクタを持つオブジェクトについては、 コンストラクタはで実行結果を開始する前に にオブジェクトの任意の非静的メンバまたはベースクラスを参照未定義の動作。例
struct W { int j; };
struct X : public virtual W { };
struct Y {
int *p;
X x;
Y() : p(&x.j) { // undefined, x is not yet constructed
}
};
質問は良いですが、コードサンプルはやや人工的です。 'static_'として' fill_arr'を宣言するのを妨げ、その正当性を疑う余地はありません。 –
これはスレッドセーフなのでしょうか?つまり、 'fill_arr'にローカルなベクトルがあります。' static'の場合は、それをある種のmutexで保護していますか? –
'std :: vector arr'は_automatic storage_を持っていますので、' fill_arr'関数を呼び出すたびにそのインスタンスが存在します。それは基本的なものです.C++ _... –