使用您的简化示例,我只需执行以下操作:
struct S{ float const * const * const data;};
auto create_buffer() -> float const * const * {
float **buf;
/* ... compute buffer contents */
return buf;
}
S s {create_buffer()};
但是,在评论中,您提到您有很多成员,并且基于顺序初始化成员还不够清楚。
struct S { const A a; const B b; const C c; };
S s {x,y,z}; // order based, not readable enough.
const
成员必须作为对象构造的一部分进行初始化。您必须在初始化程序中以某种方式指定它们,或者必须在类中设置它们的值,以便在构造时设置它们。
解决方案 1
在构造过程中传递它们的一种方法,但以一种可读的方式是使用第二个对象来帮助初始化:
struct S_initializer { A a; B b; C c; }
struct S {
const A a; const B b; const C c;
S(S_initializer &s) : a(s.a), b(s.b), c(s.c) {}
};
S make_S() {
S_initializer s;
s.a = x;
s.b = y;
s.c = z;
return S{s};
}
以上涉及到一些重复,您可以通过将初始化助手对象设为 S 的 const 成员来避免这种情况:
struct S {
const S_initializer m;
S(S_initializer &s) : m{s} {}
};
S make_S() {
S_initializer s;
s.a = x;
s.b = y;
s.c = z;
return S{s};
}
权衡是现在要访问 S 的成员,您必须在其中有一个额外.m
的:
A a = s.m.a; // versus just s.a;
解决方案 2
第二种方法依赖于编译器扩展;尽管不是标准的 C++,但 gcc 和 clang 在 C++ 中实现了 C99 指定的初始化程序。VC++ 没有实现这一点。
S s { .a = x, .b = y, .c = z };