此代码失败,并克++ 4.9和更高版本(包括从SVN当前建立,),但没有与铛++和微软的编译器警告编译(从VS2015)为什么g ++不能从具有转换运算符和不可访问的函数调用运算符的类型的std :: function <>的init初始化?
#include <functional>
struct A {
void operator()() const {}
};
struct B {
void operator()() const {}
};
struct C : private A, private B
{
operator std::function<void()>() const { return nullptr; }
};
int main()
{
std::function<void()> f{C{}};
}
在main()
f
的构造失败由于operator()
是在结构C
中不明确。
为什么g ++认为这是不明确的? C
中的函数调用运算符是私有继承的,不可访问。 向结构C
添加一个私有或明确删除的void operator()() const
,使代码按照预期编译和使用转换运算符。为什么这些无法进入的运营商在难以进入的遗传运营商做什么时不会造成问题?
这很有道理@ildjarn。所以铿锵++和ms编译器都接受了代码错了吗? – rollbear
实际上我不确定;访问检查确实是在重载解析之后执行的,但我真的不知道'C'的转换操作符在哪里进入。我的直觉说海湾合作委员会是正确的,但我不会支持太多...有一个upvote,很好的问题。 ; - ] – ildjarn
*私人继承和不可见*不正确,'私人'并不意味着不可见,这意味着无法访问。重载解决后检查访问。 –