7

「変換コンストラクター」を使用した限り、それらは次のようになります。

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 コンストラクタによる変換

  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)

複数形を使用した定式化がどのように意味を成しているのかわかりません。複数の引数で変換を実行できることを本当に示していますか? これは何を意味するのでしょうか?

4

1 に答える 1

10

言語は、初期化子リストの追加の一部として変更されました。n2672: init-list の文言を参照してください。

例:

struct S {
    S(int x, double y) { }
};

void f(S) { }

int main() {
    f({ 42, 42.0 });
}
于 2012-11-20T15:22:31.480 に答える