繁体   English   中英

实例化一个私有类型的 function 参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM