聚合初始化绕过 private class 构造函数
Aggregate initialization by-passes private class constructor
我一直认为聚合初始化是为了避免编码人员编写自定义构造函数。然而,这似乎已经“潜入”了私有构造函数的“安全旁路”。
假设我有 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
的“hidden”构造函数吗?
实例: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 中,通过引入默认(和删除)成员函数引入了这种带有私有(甚至删除!)默认构造函数的聚合情况。它不再存在于 C++20 中,其中 A
不再是聚合。
So my question is: is aggregate initialization a "hidden" constructor
我会将聚合初始化描述为根本不使用构造函数。相反,成员直接初始化。
我一直认为聚合初始化是为了避免编码人员编写自定义构造函数。然而,这似乎已经“潜入”了私有构造函数的“安全旁路”。
假设我有 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
的“hidden”构造函数吗?
实例: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 中,通过引入默认(和删除)成员函数引入了这种带有私有(甚至删除!)默认构造函数的聚合情况。它不再存在于 C++20 中,其中 A
不再是聚合。
So my question is: is aggregate initialization a "hidden" constructor
我会将聚合初始化描述为根本不使用构造函数。相反,成员直接初始化。