3

次のコードを考えてみましょう。

class A{
public:
  A(int x){}
};

class B{
public:
  B(A a){};
};


int main() {
  B b = 5;
  return 0;
}

コンパイル中に、コンパイラは次のように不平を言います。

/home/test/main.cpp:80: candidate constructor not viable: no known conversion from 'int' to 'A' for 1st argument

コンストラクターを作成したくありませんB(int)-コンパイラーが暗黙的にこれintAオブジェクトに変換することを望みます。

編集:

直接初期化は次のように機能します。

B b(5);

代わりに代入演算子を使用することは可能ですか?

4

3 に答える 3

0

代わりに直接初期化を使用します。

B b(5);
于 2013-06-27T09:50:22.860 に答える
0

への変換が制限されている変換コンストラクターを使用できますA

class B {
public:
    // It doesn't hurt to keep that one
    B(A a){};

    template<
        typename T
        , EnableIf<std::is_convertible<T, A>>...
    >
    B(T&& value)
    {
        // How to use the value
        A a = std::forward<T>(value);
    }
};

// Now B b = foo; is valid iff A a = foo; is, except for a few exceptions

EnableIf制約の目的を理解していることを確認してください。これを使用しないと、ひどいコンパイル エラーが発生するか、さらに悪いことに、エラーがまったく発生しなくなります。Bまた、潜在的に多くの型から変換可能にする価値があるかどうかも慎重に検討する必要があります。暗黙的な変換は、プログラムを理解しにくくする傾向があり、それがもたらす明らかな利点をすぐに上回る可能性があります。

于 2013-06-27T11:09:55.477 に答える