[英]Instantiating a function parameter that is of private type
给出这样的 class:
class MyClass {
struct PrivateType {};
public:
static void func(PrivateType) {}
};
我不能这样做,因为 PrivateType 是私有的:
MyClass::func(MyClass::PrivateType());
但我可以这样做:
MyClass::func({});
所以我正在实例化一个私有类型,看起来像在 class scope 之外。这是从初始化列表的隐式转换吗? 如果是这样,当参数被隐式转换时,转换是否发生在 class 的 scope 中,即它是否是 function 的主体的一部分? 为什么会这样,而且总是这样吗?
{}
是一种称为braced-init-list的语法。 它没有类型或值类别,也不像表达式那样表示任何 object 或值。 因此,考虑存在从{}
转换之类的东西也没有什么意义。
关于重载解析如何将 _braced-init-list_s 视为 arguments,存在与表达式 arguments 不同的特定规则。
当从braced-init-list初始化时,还有一些规则与从括号初始化的规则分开。 但是,在重载解析之后,参数 function 总是被简单地初始化,就好像参数是复制初始化中参数的初始化器一样,这意味着PrivateType
参数 object(我将在此处命名为private_type
)将被初始化,就像通过
PrivateType private_type = {};
在局部变量定义中。 但是,这种初始化总是发生在调用者的上下文中。 所有这些对于表达式 function arguments 也是如此。
使用示例中定义的类型进行的初始化将解析为聚合初始化,因为PrivateType
是聚合 class。由于没有要初始化的成员或基类,因此初始化不会执行任何操作。
这些都没有考虑PrivateType
是否可以从调用者的上下文访问( private
),因为可访问性仅在决定是否可以命名成员时适用(例如,对成员 function 的重载解析,构造函数或运算符重载计为named )。 但是,您永远不会在调用者中使用名称PrivateType
。 private
在任何情况下都不会阻止成员 class 的构造。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.