Bil*_*ias 4 c++ private friend aggregate-initialization
我一直认为聚合初始化是为了让编码人员免于编写自定义构造函数。然而,这似乎“潜入”了私有构造函数的“安全旁路”。
假设我有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;
}
Run Code Online (Sandbox Code Playgroud)
上面的示例编译并运行良好,并且通过使用大括号,我可以非常轻松地A在任何地方创建对象。
防止这种情况的唯一方法是编写一个用户构造函数,然后完全取消聚合初始化。
所以我的问题是:聚合初始化是默认的“隐藏public”构造函数吗?
实例: https: //onlinegdb.com/r1jHLxzRD
没有答案的类似问题:私有聚合初始化
我一直认为聚合初始化是为了让编码人员免于编写自定义构造函数。
这是聚合初始化所实现的目标,但将其定义为聚合初始化的目的过于简单化。
然而,这似乎“潜入”了私有构造函数的“安全旁路”。
这种使用私有(甚至删除!)默认构造函数进行聚合的偷偷摸摸的情况是在 C++11 中通过引入默认(和删除)成员函数而引入的。它不再存在于 C++20 中,其中A不再是聚合。
所以我的问题是:聚合初始化是一个“隐藏”构造函数
我将聚合初始化描述为根本不使用构造函数。相反,成员是直接初始化的。
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |