gpt4 book ai didi

c++ - 为什么 C++20 范围适配器的返回 View 不是常量表达式?

转载 作者:行者123 更新时间:2023-12-04 01:05:00 24 4
gpt4 key购买 nike

考虑以下代码:

#include <ranges>

int main() {
constexpr int a[] = {1, 2, 3, 4};
constexpr auto r = a | std::views::take(3);
static_assert(*r.begin() == 1);
}
msvc 接受它,gcc rejects它与:
<source>:5:44: error: 'std::ranges::take_view<std::ranges::ref_view<const int [4]> >{3, std::ranges::ref_view<const int [4]>{(& a)}}' is not a constant expression
5 | constexpr auto r = a | std::views::take(3);
| ^
为什么 r是不是常量表达式?

最佳答案

范围位是一个红鲱鱼。可以归结为这个

int main() {
constexpr int a[] = {1, 2, 3, 4};
constexpr auto r = a ;
}
我们无法形成 constexpr指向 a 第一个元素的指针.这样的指针被限制为仅保存具有静态存储持续时间的对象的地址。 View 对象(作为其实现的一部分)需要保留一个迭代器的拷贝(在我们的例子中是指针)。
r已声明 constexpr并且它内部持有一个指向对象的指针,该对象也必须具有静态存储持续时间。确实,修改代码以包含
static constexpr int a[] = {1, 2, 3, 4};
使 GCC accept你的榜样快乐。
但是,MSVC 不符合标准。它也接受无效的普通指针示例。

关于c++ - 为什么 C++20 范围适配器的返回 View 不是常量表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66794703/

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