2

如果生成的转换类型由于基类匹配而允许函数调用,我的编译器(GCC 4.7)似乎不会发出隐式类型转换,即转换结果AAB.

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

请不要回答可怜的编译器有很多事情要做,与基类匹配会太多。

不,但我要告诉你的是,糟糕的编译器有很多事情要做,而且它无法匹配所有潜在的派生类(或通过第三种类型进行的其他转换)

您的代码中的问题不是编译器很乐意这样做的从to向上转换,而是它无法转换为. 允许的转换集是有限的,并且会产生有限的工作集。当您调用运算符时,它会找到一个包含两个对象的匹配项,并且它不知道如何直接将 转换为. 很明显,它可以创建一个临时的然后从它向上转换,因为它向上转换了第二个参数。对于不知道有多少潜在类型派生自(考虑单独编译的其他翻译单元)或什至可以从 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 回答