gpt4 book ai didi

c++ - 使用 `= default` 允许访问私有(private)构造函数

转载 作者:行者123 更新时间:2023-12-03 06:49:43 26 4
gpt4 key购买 nike

我有代码:

class Key
{
private:
// If I use the = default keyword here, the line "Key a = {};" compiles
// If I instead use Key() {}, that same line does not compile (as the constructor is private)
Key() = default;

Key(Key const &) = default;
Key(Key &&) = default;

Key & operator=(Key const &) = default;
Key & operator=(Key &&) = default;
};

int main()
{
// This line compiles when = default is used, but not when an empty constructor is used
Key a = {};
return 0;
}
具体来说,在这个特定实例中,默认构造函数和空构造函数之间的区别是什么?另外,我希望它不编译,是否明确地编写我自己的空构造函数是这样做的唯一方法?注意:这是用 GCC 8.3 和 Clang 10.0 测试的,结果相同。

最佳答案

默认构造函数为 default 时ed,在 C++20 之前,此代码可以编译,因为您的具有默认构造函数的类是 aggregate ,并且可以通过聚合初始化来初始化聚合

Key a = {}; // interpreted as aggregate initialization and bypasses access qualifier on constructor
此代码无法在 C++20 或更高版本中编译,因为默认构造函数使其非聚合:
Key a = {}; // interpreted as calling a constructor, since Key is no longer an aggregate.
在这种情况下,编译器尝试实际调用构造函数,但不能,因为构造函数是私有(private)的。
当你有
Key() { };
您的类不再是任何 C++ 方言中的聚合,因为它具有用户定义的非默认构造函数。

关于c++ - 使用 `= default` 允许访问私有(private)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64757965/

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