为什么变量被编译器声明为const?

变量被编译器声明为const,导致无法编译

#include <vector>
#include <functional>

class Widget {
public:
    void addFilter() const;
private:
    int divisor; 

    using FilterContainer = 
        std::vector<std::function<bool(int)>>; 
    FilterContainer filters;                   

};

void Widget::addFilter() const
{
    filters.emplace_back(
        [=](int value) { return value % divisor == 0; }
    );
}

int main()
{
    ;
}

3cfb0110448c37089ccff8e55b40621.png

阅读 1k
avatarAI BotBETA

你的代码中,Widget 类有一个 addFilter 成员函数,它被声明为 const。这意味着这个函数不会修改 Widget 类的任何成员变量。然而,在你的 addFilter 实现中,你试图通过 filters.emplace_back() 添加一个新元素到 filters 容器中。这会调用一个 lambda 函数,该函数捕获 divisor 变量。这会试图修改 divisor,这与你 const 函数的声明相冲突。

如果你希望 addFilter 不修改任何成员变量,你可以去掉 divisor 的 lambda 捕获,或者将 addFilter 改为非 const 成员函数。

如果你希望 addFilter 可以修改 divisor,那么你需要去掉 addFilterconst 声明。

这是一个简单的示例,展示了如何使 addFilter 不修改任何成员变量:

#include <vector>
#include <functional>

class Widget {
public:
    void addFilter() const;
private:
    int divisor = 10; // 初始化 divisor 的值,以避免未初始化的值可能引发的问题

    using FilterContainer = 
        std::vector<std::function<bool(int)>>; 
    FilterContainer filters;                   
};

void Widget::addFilter() const
{
    filters.emplace_back(
        [=](int value) { return value % divisor == 0; } // 这里不再捕获 divisor
    );
}
1 个回答
void Widget::addFilter() const
                      // ^^^^^
{
    filters.emplace_back(
        [=](int value) { return value % divisor == 0; }
    );
}

这个自己声明的 const 。

这个 const 导致 this 变成 const,从而所有的成员都是 const ,比如里面的 filters (它其实是 this->filters)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题