C++は常に値の初期化子よりもリストの初期化子を優先しているようです。私の質問は、直接リストの初期化もサポートする型の値の初期化を強制する方法です。ここでは、最小限の非稼働例です。この例ではC++ 11の値の初期化子とリストの初期化子
#include <initializer_list>
using namespace std;
struct foo {
foo(int) {}
foo(initializer_list<char>) {}
};
struct bar {
foo f{256};
};
、私はfoo(initializer_list<char>)
ではなく、コンストラクタfoo(int)
を使用して初期化するf
をしたいと思います。しかし、GCCとClangの両方は、256がcharに対して大きすぎるため、C++仕様ではリスト初期化子を選択する必要があるため、コードを拒否します。明らかに、foo
という2番目のコンストラクタをコメントアウトすると、問題が修正されます。フィールドf
で値の初期化を使用するように、bar
を定義する最も簡単な方法は何ですか?私の実際の例ではコピーコンストラクタが存在しないので、理想的にはf
のコピー初期化を避けることができます。明確にするために
更新
:もちろんそれはbar
のすべての単一のコンストラクタで明示的にf
を初期化することが可能です。しかし、私の質問は、メンバの初期化構文についてです。なぜなら、膨大な数のコンストラクタがある状況では、コード全体をコピーするのではなく、1つの場所で特定のフィールドを初期化する方が望ましいからです。
コンストラクタを作成しますか? –
'foo f(256);'と書いてください。 –
'initializer_list'が '{256}'の実行可能なコンストラクタである理由について説明したいと思います。また、コンパイラの振る舞いに基づいて仕様について推論することは安全ではありません。時々複数のコンパイラが同じことを間違ってしまうことがあります。 –