我有班级
class A
{
public:
class Key
{
Key() {}
Key(Key const &) {}
};
A(Key key, int a = 5) {}
};
Key
的构造函数是私有的,因此没有人能够构造对象A
。但是,使用以下代码:
int main() {
A a(A::Key()); // this compiles !!!
A a2(A::Key(), 5); // this doesn't
// somehow defaulting the argument causes the private constructor
// to be OK - no idea why
return 0;
}
通过在我的构造函数中使用int a
的默认参数,编译器很高兴地编译了A::Key()
的用法,尽管它是私有的。但是,如果我明确地为a
提供了值,则编译器会正确识别我正在尝试使用私有构造函数并输出错误。为什么是这样?有没有办法强制编译器在第一个例子中出错?
有关实例,请参阅here。
答案 0 :(得分:7)
这是因为最令人烦恼的解析。
A a(A::Key());
不创建名为A
的{{1}}并使用临时a
构建它。它创建一个函数A::Key
,返回a
并获取一个未命名的指针,该函数返回A
。
如果向其添加一对括号,则会出现编译错误
A::Key
您正在尝试调用私有构造函数。或者,您可以使用统一初始化,这也可以消除歧义并导致编译错误
A a((A::Key()));