具有私有成员的结构的构造函数
Constructor for Struct with Private Members
考虑以下代码:
class A
{
private:
struct B { private: int i; friend class A; };
public:
static void foo1()
{
B b;
b.i = 0;
}
static void foo2()
{
B b = {0};
}
};
为什么foo1有效,而foo2无效?结构初始值设定项构造函数对于类A不可见吗?有没有办法在C++11中实现这一点?
(注意,删除私有会使foo2工作。)
为什么
foo1
有效而foo2
无效?结构初始值设定项构造函数对于类A
是否可见
B b = {0};
不起作用,因为B
不是聚合。它不是聚合,因为它有一个非静态的私有数据成员。如果删除私有说明符,B
将变为Aggregate,因此可以用这种方式进行初始化。
C++03标准8.5.1骨料
第7段:
如果列表中的初始化程序少于聚合中的成员,则每个未显式初始化的成员都应进行值初始化(8.5)。[示例:
struct S { int a; char* b; int c; }; S ss = { 1, "asdf" };
用
1
初始化ss.a
,用"asdf"
初始化ss.b
,用形式为int()
的表达式的值初始化ss.c
,即0
。]
C++03标准8.5.1§1:
聚合是一个没有用户声明的数组或类(子句9)构造函数(12.1),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),也没有虚拟函数(10.3)。
相关文章:
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 嵌套的模板结构构造函数实现
- 其他结构中的结构构造函数
- CPP/C 中的常量用法和结构构造函数中的澄清
- 聚合结构构造函数
- 结构构造函数调用不明确
- 关于结构构造函数和析构函数行为-C++
- 带有指针的C++结构:构造函数和析构函数
- 结构构造函数导致堆栈溢出的问题
- C++结构构造函数和函数冲突
- 嵌套结构构造函数和并集的问题
- C++结构构造函数
- 调用结构构造函数后初始化的值是什么
- 在结构构造函数中使用"this"关键字编译错误?-C++
- 这可能吗?在 C# 中调用托管 c++ 结构构造函数
- C++ - 结构构造函数,尝试取消指向结构的指针时出现重定义错误
- C++结构构造函数错误
- 结构构造函数语法
- 结构构造函数错误,为什么使用默认构造函数会调用错误
- Qt 将 QString 传递给结构构造函数不起作用