允许构造函数调用私有方法的默认参数

时间:2017-09-29 14:34:57

标签: c++ constructor private most-vexing-parse

我有班级

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

1 个答案:

答案 0 :(得分:7)

这是因为最令人烦恼的解析。

A a(A::Key());

不创建名为A的{​​{1}}并使用临时a构建它。它创建一个函数A::Key,返回a并获取一个未命名的指针,该函数返回A

如果向其添加一对括号,则会出现编译错误

A::Key

您正在尝试调用私有构造函数。或者,您可以使用统一初始化,这也可以消除歧义并导致编译错误

A a((A::Key()));