「変換コンストラクター」を使用した限り、それらは次のようになります。
struct X {
X(A); // conversion from A -> X
X(B,C = someC); // conversion from B -> X, with some default C
};
X x1 = A(); // calls X::X(A())
X x2 = B(); // calls X::X(B(),someC)
これは完全に理にかなっています。私が知る限り、コンストラクターがない限り機能します。
struct Y {
Y(A,B); // no implicit conversion
};
ただし、これが興味深いところです。C++11 標準は文字通り次のように読みます。
12.3.1 コンストラクタによる変換
explicit
単一のパラメーターで呼び出すことができるfunction-specifier なしで宣言されたコンストラクターは、そのパラメーターの最初のパラメーターの型からそのクラスの型への変換を指定します。このようなコンストラクターは、変換コンストラクターと呼ばれます。
(イタリック体はもともと下線が引かれていましたが、マークダウンでは受け入れられません<u>
)
これは、変換コンストラクターが「単一のパラメーターで」呼び出し可能である必要がなく、「最初のパラメーターの型」から「そのパラメーターの型」への変更が変更されたことを示唆しているようです(複数形に注意してください!)これをさらにサポートします。これらを許可するために、「最初のパラメーターの型」が「単一の非オプションパラメーターの型」(1) または「明示的な引数を受け取ったパラメーターの型」(2) に変更されることを期待していますが、 :
struct Z {
Z(A = a, B, C = c); // (1)
Z(D = d, E = e, F = f); // (2)
};
Z = D(); // (2)
Z = E(); // (2)
複数形を使用した定式化がどのように意味を成しているのかわかりません。複数の引数で変換を実行できることを本当に示していますか? これは何を意味するのでしょうか?