gpt4 book ai didi

c++ - 聚合初始化绕过私有(private)类构造函数

转载 作者:行者123 更新时间:2023-12-04 01:08:21 25 4
gpt4 key购买 nike

我一直认为聚合初始化是为了让程序员免于编写自定义构造函数。但是,这似乎为私有(private)构造函数“潜入”了“安全绕过”。
假设我有 class A我只想由 class B 创建.

struct A
{
friend class B;
const int i, k;
private:
A () = default;
};

class B
{
public:
A what () { return {1, 2}; }
};

int main ()
{
B b {};
A a {2,3}; // oh no
return 0;
}
上面的例子编译并运行良好,通过使用大括号我可以很容易地创建一个 A任何地方的对象。
防止这种情况的唯一方法是编写一个用户构造函数,然后完全取消聚合初始化。
所以我的问题是:聚合初始化是一个“ 隐藏”构造函数,默认情况下是 public ?
实时示例: https://onlinegdb.com/r1jHLxzRD
没有答案的类似问题: Private aggregate initialization

最佳答案

I always thought that aggregate initialization was to save coders from writing custom constructors.


这是聚合初始化实现的目标,但将其定义为聚合初始化的目的过于简化。

However, this seems to have "sneaked in" a "security by-pass" for private constructors.


通过引入默认(和已删除)成员函数,在 C++11 中引入了具有私有(private)(甚至已删除!)默认构造函数的聚合这种偷偷摸摸的情况。它不再在 C++20 中退出,其中 A不再是聚合。

So my question is: is aggregate initialization a "hidden" constructor


我将聚合初始化描述为根本不使用构造函数。相反,成员被直接初始化。

关于c++ - 聚合初始化绕过私有(private)类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65580725/

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