1

暗黙的なコンストラクターの変換は、単一の変換でのみ機能するようです。

class A {
public:
    A(std::string s) {}
};
class B {
public:
    B(A a) { }
};

上記のコードで、実行中

B b{std::string("Hey")};

正常に動作します。

一方で、

B b{"Hey"};

ではない。

コンストラクターの変換は実際には単一の変換でのみ機能しますか?なぜそうなるのでしょうか? 異なるコンストラクターが提供されている場合に発生する可能性のあるあいまいさを回避するには?

4

2 に答える 2

3

コンストラクターの変換は、実際には単一の変換でのみ機能しますか?

はい、単一のユーザー定義の変換です。また、その変換の前後に標準変換が含まれることもあります。

これはなぜですか?

簡単な答えは、それが言語の指定方法だからです。

さらに便利なことに、2 つの変換が許可されている場合、コンパイラは、適切な中間型があるかどうかを判断するために、知っているすべての型を考慮する必要があります。これは多くの作業になるだけでなく (任意の数の変換を許可する場合、組み合わせの爆発を伴います)、あいまいさが生じたり、その時点でたまたま定義されている型に応じて動作が微妙に変化したりする可能性があります。コード。

于 2013-09-19T13:31:00.810 に答える