【发布时间】:2019-05-14 08:00:35
【问题描述】:
在将私有成员作为参数传递给所有者的类函数时,通过聚合初始化来初始化私有成员是否正确?请看下面的代码。
class A {
struct S {
int t, u;
};
public:
void f(const S& s) {}
};
int main() {
A a;
a.f({1, 2}); // correct?
return 0;
}
我检查了标准和网络,似乎没有确切的答案。看起来机制如下: * 大括号初始化程序是公共的,因此用户不会违反访问限制。 * 从初始化程序到“S”的隐式转换对于“S”是内部的,因此也适用于编译器。
问题是,标准、草案或至少 cppreference 中是否有对此行为的描述的参考?
【问题讨论】:
-
没关系。但是,如果您想要引用 C++ 标准的答案,请添加
language-lawyer标签。 -
@StepanDyatkovskiy:
A不是聚合,因为private结构。 -
建议您将其设为
f(S),不要用创建临时文件的问题来混淆这个问题。 -
@P.W,但是“S”是一个集合,不是吗?
-
@StepanDyatkovskiy:是的,IMO 这应该可行。
标签: c++11 language-lawyer aggregate-initialization