gpt4 book ai didi

c++ - 可以将两个连续的相同类型的数组视为一个吗?

转载 作者:行者123 更新时间:2023-12-02 09:48:35 25 4
gpt4 key购买 nike

考虑以下代码:

struct S {
int a[2] = {1, 1};
int b[3] = {2, 2 ,2};
};

int main() {
S s;

for (auto *p = std::begin(s.a); p != std::end(s.a); p++)
std::cout << *p << std::endl;

for (auto *p = std::begin(s.b); p != std::end(s.b); p++)
std::cout << *p << std::endl;

return 0;
}
我可以像这样重写它(并且仍然有相同的结果)吗?
struct S {
int a[2] = {1, 1};
int b[3] = {2, 2 ,2};
};

int main() {
S s;

for (auto *p = std::begin(s.a); p != std::end(s.b); p++)
std::cout << *p << std::endl;

return 0;
}
S这段代码中的结构是 StandardLayout 所以保证 b地址高于 a .第二种方法是安全的还是有某种 UB?
如果 a只是一个 int (不是数组)。我可以执行以下操作吗?
    for (auto *p = &s.a; p != std::end(s.b); p++)
std::cout << *p << std::endl;

最佳答案

对于标准布局类型,有 note :

There might therefore be unnamed padding within a standard-layout struct object inserted by an implementation, but not at its beginning, as necessary to achieve appropriate alignment.


所以成员之间可能有填充 ab .
即使没有填充, std::begin(b) std::end(a) 将简单地返回指向底层数组的指针。比较指针的结果 a + 2bunspecified .此外,只需计算 a + 3undefined ,所以你不能用你尝试过的指针的方式来做。
为了得到你想要的效果,你可以编写一个自定义的迭代器接口(interface),在内部管理指向不同对象的指针。或者您可以只使用 range-v3 库,如下所示:
for(auto i : ranges::views::concat(s.a, s.b))
std::cout << i;

关于c++ - 可以将两个连续的相同类型的数组视为一个吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62613795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com