LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

#include <cstdio>
#include <ftl/lazy.h>

void f(ftl::lazy<int> a, ftl::lazy<int> b) {
    if (*a > 0) printf("a = %d\n", *a);
    else if (*a > -1 && *b > 0) printf("a = %d, b = %d\n", *a, *b);
}

int main() {
    {
        auto a = ftl::defer([]() { puts("compute a"); return 1; });
        auto b = ftl::defer([]() { puts("compute b"); return 2; });
        f(a, b);
    }
    {
        auto a = ftl::defer([]() { puts("compute a"); return 0; });
        auto b = ftl::defer([]() { puts("compute b"); return 1; });
        f(a, b);
    }
}

/*
compute a
a = 1
compute a
compute b
a = 0, b = 1
 */

Исходная версия quasimoto, :

#include <cstdio>
#include <ftl/lazy.h>

void f(ftl::lazy<int> a, ftl::lazy<int> b) {
    if (*a > 0) printf("a = %d\n", *a);
    else if (*a > -1 && *b > 0 ) printf("a = %d, b = %d\n", *a, *b);
}

int main() {
    {
        auto a = ftl::defer([]() { puts("compute a"); return 1; });
        auto b = ftl::defer([]() { puts("compute b"); return 2; });
        f(a, b);
    }
    {
        auto a = ftl::defer([]() { puts("compute a"); return 0; });
        auto b = ftl::defer([]() { puts("compute b"); return 1; });
        f(a, b);
    }
}

/*
compute a
a = 1
compute a
compute b
a = 0, b = 1
 */