gpt4 book ai didi

c++ - 允许构造函数调用私有(private)方法的默认参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:30 25 4
gpt4 key购买 nike

我有课

class A
{
public:
class Key
{
Key() {}
Key(Key const &) {}
};

A(Key key, int a = 5) {}
};

Key 的构造函数是私有(private)的,因此任何人都不能构造对象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() 的用法,尽管它是私有(private)的。但是,如果我显式地为​​ a 赋值,编译器会正确地识别出我正在尝试使用私有(private)构造函数并出错。为什么是这样?是否有某种方法可以强制编译器也对第一个示例出错?

参见 here举个例子。

最佳答案

这是因为最烦人的解析。

A a(A::Key());

不创建名为 aA 并使用临时 A::Key 构造它。它创建一个返回 A 的函数 a 并采用一个未命名的指针指向返回 A::Key 的函数。

如果你给它加上一对括号,你会得到一个编译错误

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

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

A a(A::Key{});

关于c++ - 允许构造函数调用私有(private)方法的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46491135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com