通过聚合初始化将私有成员作为参数传递到所有者的类函数中来初始化私有成员是否正确?只需看下面的代码即可。
git push --force
我检查了标准和网,似乎没有确切答案。看起来机制如下: *大括号初始化器是公共的,因此用户不会违反访问限制。 *从初始化程序到“ S”的隐式转换是“ S”的内部功能,因此对于编译器也很好。
问题是,在此行为的描述中是否在标准,草案或至少cppreference中有引用?
答案 0 :(得分:2)
是的,这是正确的。 S
唯一的私密性是名称。访问控制仅通过名称(package on CRAN for the R language called data.tree)控制访问。因此,您可以使用类型特征来获取S
的类型,例如通过f
的类型([class.access]p4)。
因此,之所以可以这样做是因为没有example限制禁止初始化“私有”类型。
也有[dcl.init.agg],由@StephaDyatkovskiy找到。
答案 1 :(得分:-1)
我会说“这是有效的C ++”是一个错误的问题。
当您查看一段代码并尝试尝试时,您无法确定该代码是否应为有效的C ++;而且您知道这将取决于标准的确切措辞,这将是一个极端的情况-通常,最好不要以任何一种方式依赖该极端的情况。为什么?因为其他人也会感到困惑;他们会浪费时间试图弄清楚你的意思;他们会去按标准查找-或更糟糕的是,不查找,并做出无效的假设;他们会分心于他们实际需要关注的重点。
因此,使用这段代码,我会问自己:“类型S
是否真的是私有的?外部代码真的不需要了解它吗?”
如果答案是“是,是”-那么我将更改f
,以获取S构造函数的参数(并将其转发给ctor):
void f(int t, int u) { S {t, u}; /* etc. etc. */ }
如果答案是“否,则调用f()
的代码可以知道它正在传递S
引用”-那么我将公开S
。