【发布时间】:2014-02-07 19:26:19
【问题描述】:
我在 C++ 中发现了一些我认为奇怪的行为:私有基类中的类型转换运算符在尝试解析隐式转换时使编译器感到困惑:
#include <iostream>
struct Base
{
#ifdef ENABLE
operator bool () const { return true; }
#endif
};
struct Derived : private Base
{
operator int () const { return 7; }
};
int main()
{
Derived o;
std::cout << o << '\n';
return 0;
}
没有-DENABLE,代码编译得很好,并输出7。使用-DENABLE,代码不再编译,抱怨一个模棱两可的重载。我试过gcc-4.6.5、gcc-4.8.1 和clang-3.3。令人困惑的是,我显然不能要求(bool)o,因为Base 是一个私人基地。
这是预期的行为吗?
【问题讨论】:
-
在考虑访问控制之前发生过载解决。
-
那么这是在 C++ 标准中指定的吗?还是编译器的选择?
-
在标准中。
标签: c++ implicit-conversion overload-resolution private-inheritance member-access