首先 - 将任何东西初始化为临时值的地址似乎非常可疑,在 C 中也是如此。你确定这是有效的吗?嗯。无论如何,C++ 编译器真的不会让你这样做。
至于您指定的(命名字段)初始化 C++ 行 - 它实际上是非标准的,它是 GNU C++ 扩展,您不能依赖它。
你可以这样做:
struct s { int a, b; };
int main() {
s data[] = { { 1, 2 }, { 4, 5 } };
// instead of ptrArray[i], use &(data[i])
}
这编译得很好。但是 - 此代码的更多 C++'ish 版本将是:
#include <array>
struct s { int a, b; };
int main() {
std::array<s, 2> data { s{ 1, 2 }, s{ 4, 5 } };
// instead of ptrArray[i], use &(data[i]),
// or use iterators, or ranged for loops
}
为什么要使用std::array
?这是对好处的一种解释。实际上,您可以做得更好,并减少重复自己的次数:
int main() {
auto data = make_array(s{ 1, 2 }, s{ 4, 5 });
// instead of ptrArray[i], use &(data[i]),
// or use iterators, or ranged for loops
}
函数make_array
取自这里;你也有,但这还没有标准化。std::experimental::make_array()
如果你想data
在运行时添加或删除元素,你可以切换到使用std::vector
:
#include <vector>
struct s { int a, b; };
int main() {
std::vector<s> data { s{ 1, 2 }, s{ 4, 5 } };
// instead of ptrArray[i], use &(data[i]),
// or use iterators, or ranged for loops
}