2

私のコンパイラ(GCC 4.7)は、結果の変換された型が基本クラスの一致により関数呼び出しを許可する場合、つまり変換結果Aが a である場合、暗黙的な型変換を発行しないようABです。

class AB {};

class A: public AB
{
public:
  A(float i) {}
  A() {}
  A(const A& rhs) {}
  A(A&& rhs) {}
 };

AB operator*(const AB& lhs,const AB& rhs)
{
  // Return default constructed AB
}

void foo() {
  A a;
  auto tmp = 2.0 * a;   // This fails because no conversion rule was found.
}

これは C++ 言語の機能ですか? もしそうなら、どのような状況で基本クラスと照合しないほうがよいでしょうか。

貧弱なコンパイラにはやるべきことがたくさんあり、基本クラスと比較するには多すぎるということに答えないでください。

編集

c.cc:51:20: error: no match for ‘operator*’ in ‘2.0e+0 * a’
c.cc:51:20: note: candidate is: c.cc:42:1: note: AB operator*(const
AB&, const AB&) c.cc:42:1: note:   no known conversion for argument 1
from ‘double’ to ‘const AB&’ c.cc:51:20: error: unable to deduce
‘auto’ from ‘<expression error>’
4

2 に答える 2

5

貧弱なコンパイラにはやるべきことがたくさんあり、基本クラスと比較するには多すぎるということに答えないでください。

いいえ、しかし、私があなたに言うことは、貧弱なコンパイラはやるべきことがたくさんあり、すべての潜在的な派生クラス (または 3 番目の型による他の変換) と一致するには多すぎるということです。

コードの問題は、コンパイラが喜んで行うからへのアップキャストではなく、 .に変換できないという事実です。許可される変換のセットは制限されており、有限の作業セットが生成されます。演算子を呼び出すと、2 つのオブジェクトを取る一致が見つかり、を に直接変換する方法がわかりません。2 番目の引数をアップキャストしたため、一時的なものを作成し、そこからアップキャストできることは明らかです。潜在的な型がいくつ派生するか (個別にコンパイルされた他の翻訳単位を考慮してください)、または a から構築でき、変換演算子を持つことができる無関係な型さえも知らないコンパイラーにとっては、それほど明白ではありません。AAB2.0ABABdoubleABAAdoubleAB

于 2012-11-05T13:32:27.050 に答える
2

C++ 標準では、コード内の変換と同様の一連の変換を使用して、形式が正しくないプログラムの例を示しています。§13.3.1 を参照してください。

class T {
 public:
  T();
};
class C : T {
 public:
  C(int);
};
T a = 1;  // ill-formed: T(C(1)) not tried.
于 2012-11-05T13:10:14.727 に答える