我发现C++中的lambda函数有时可以绕过const限制,是bug吗?

问题描述 投票:0回答:0

我正在测试惰性求值的实现。为此,我将一个 lambda 函数作为参数传递给成员构造函数,该函数仅在第一次评估发生时执行。但是,我注意到 lambda 函数可以通过捕获的变量访问类成员变量,并且我可以在 lambda 函数内部修改它们。

template<typename T>
class Lazy {
private:
    std::function<T()> get_value;
    mutable std::mutex mutex;
    mutable bool evaluated = false;
    mutable T value;
public:
    Lazy(std::function<T()> f) : get_value(f) {}
    const T& operator()() const {
        std::lock_guard<std::mutex> lock(mutex);
        if(!evaluated) {
            value = get_value();
            evaluated = true;
        }
        return value;
    }
};

struct Foo {
private:
    double x;
public:
    Lazy<double> root;
    Foo(double _x) : x(_x), root(
        [this]()->double { 
            double a = x/2;
            std::cout << "Calculating root of " << x << std::endl;
            for(auto i:iota(0, 1000000000)) a = (a + x/a) / 2;
            x = 3; //try to modify this-> x
            return a;
        }
    ) {}
};

void print_root(const Foo& f) {
    for(auto i:iota(0,10)) std::cout << f.root() << std::endl;
}

然后 g++ 编译器不报告任何错误。

c++ gcc g++
© www.soinside.com 2019 - 2024. All rights reserved.