Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在编译时何时计算ranges::View?_C++_C++20_Range V3 - Fatal编程技术网

C++ 在编译时何时计算ranges::View?

C++ 在编译时何时计算ranges::View?,c++,c++20,range-v3,C++,C++20,Range V3,该库允许使用视图,从而启用对数据的延迟操作。据我所知,只有在编译时对函数求值时,才可能进行延迟操作,但要实现编译时计算,代码必须位于可能发生延迟的上下文中 我尝试使用函数ranges::view::repeat_n(0,5)重复一个数字,并将其存储为constepr变量,但编译器错误指出该函数不是constepr: error: call to non-‘constexpr’ function ‘ranges::repeat_n_view<Val> ranges::views::re

该库允许使用
视图
,从而启用对数据的延迟操作。据我所知,只有在编译时对函数求值时,才可能进行延迟操作,但要实现编译时计算,代码必须位于可能发生延迟的上下文中

我尝试使用函数
ranges::view::repeat_n(0,5)
重复一个数字,并将其存储为
constepr
变量,但编译器错误指出该函数不是
constepr

error: call to non-‘constexpr’ function ‘ranges::repeat_n_view<Val> ranges::views::repeat_n_fn::operator()(Val, std::ptrdiff_t) const requires  copy_constructible<Val> [with Val = int; std::ptrdiff_t = long int]’
   16 |     constexpr auto rng_view = ranges::view::repeat_n(0,5);
错误:调用非--'constexpr'函数'范围::repeat_n_视图范围::views::repeat_n_fn::operator()(Val,std::ptrdiff_t)const需要可复制的[with Val=int;std::ptrdiff_t=long int]'
16 | constepr auto rng_view=ranges::view::repeat_n(0,5);
这是否意味着,视图并不总是恒定的表达

这里是我的主要代码:

#include <iostream>
#include <string>
#include <range/v3/view/empty.hpp>
#include <range/v3/view/repeat_n.hpp>
#include <range/v3/algorithm/for_each.hpp>
#include <range/v3/view/cycle.hpp>
#include <range/v3/view/take.hpp>
using std::cout;

int main() {

    constexpr auto rng = ranges::view::empty<int>; //OK

    //repeat the number zero five times
    constexpr auto rng_view = ranges::view::repeat_n(0,5);//ERROR:Call to non-`constexpr` function
    std::cout << rng_view << std::endl;

    return 0;
{
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用std::cout;
int main(){
constexpr auto rng=ranges::view::empty;//确定
//把数字0重复五次
constexpr auto rng_view=ranges::view::repeat_n(0,5);//错误:调用非--`constexpr`函数

std::cout没错,视图并不总是常量表达式。某些视图(如您发现的空视图)可以声明为常量表达式。另一个视图,
repeat\n()
,以不允许其成为常量表达式的方式实现

然而,这只是回答了你明确的问题。更重要的是,你的假设“只有在编译时对函数求值时才可能进行惰性操作”对我来说似乎是错误的,你的结论也会随之动摇。我不排除我们只是指不同的东西,所以也许你想澄清一下

然而,对我来说,延迟计算只要求结果不依赖于任何外部状态,因此在计算某些内容时,它根本不重要
在实际使用之前,不必生成值序列。这是一个糟糕的例子,因为任何合理的实现都不会生成多个值,但这是无关紧要的。惰性计算中没有隐含要求强制将其作为常量表达式,也没有任何东西阻止它我是其中之一

只有在编译时对函数求值时,才可能执行延迟操作

惰性操作是按需计算结果的操作,而不是在执行似乎要计算结果的表达式时立即计算结果。例如,应用于某个容器的转换视图似乎会立即将转换操作应用于视图的每个元素。但实际上,它只应用转换尝试从视图访问值时


这个过程与编译时执行无关。

我一直认为“惰性”操作是在编译时完成的,因为编译可以优化代码,从而只计算所使用的代码块(constexpr if)或者使用表达式模板编程,您只能在请求特定位置时计算矩阵的和或乘法。我希望使用范围来避免表达式模板编程进行矩阵乘法或收缩操作。据我所知,表达式模板在编译时t完成这项工作o通过不创建临时对象和优化代码来节省内存。如果不是所有视图都是常量表达式,这意味着,如果要在编译时进行计算,表达式模板可能更优越??首先,让我们了解一些语言:。您编写了“惰性操作”我假设你的意思是根据给定的链接进行惰性计算。惰性计算与编译时计算有点矛盾,因为一方尽可能晚地执行繁重的计算,而另一方尽可能早地执行。但是,它们并不严格矛盾,实际上可以结合在一起。我在下面写了一条小评论Nicol Bolas post。也许它解释了我对惰性评估的看法,以及我为什么尝试使用范围。