c++ - muQueue.front()给出const实例,即使我没有将其标记为const

标签 c++

我在此程序中遇到问题:

#include <iostream>
#include <string>
#include <queue>
#include <functional>
int main()
{
    class Buffer{
        public:
        void consumed(size_t s) {
            //alter something inside Buffer
        }
    };

    std::queue<Buffer> bufferFifo;
    typedef std::function<void()> Task;
    std::queue<Task> tasks;
    auto b = bufferFifo.front();
    tasks.emplace([b]() {
            b.consumed(0);
        });
}
我在程序中遇到的错误是这样的:
错误:成员函数'consumed'的'this'参数类型为'const libopenvpn::Buffer ',但函数未标记为const
b.consumed(r-> size());
但是在在线编译器上创建此最小可行示例时遇到的错误是:http://cpp.sh/9zksg是:
 In lambda function:
20:25: error: passing 'const main()::Buffer' as 'this' argument of 'void main()::Buffer::consumed(size_t)' discards qualifiers [-fpermissive]
 
我相信是同样的错误。看起来有点像,即使我没有在任何地方使它成为const,b也被标记为const
为什么是const?

最佳答案

默认情况下,通过lambda中的值捕获的任何变量都是const
如果将lambda标记为mutable,则捕获的b不再是const:

tasks.emplace( [b] () mutable {
       b.consumed(0);
});
这是demo
另外,通过引用捕获的变量是非常量的,因此您可以通过引用捕获b:
tasks.emplace( [&b] () {
       b.consumed(0);
});
这是一个demo

关于c++ - muQueue.front()给出const实例,即使我没有将其标记为const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62805479/

相关文章:

C++:非本地类型提升

c++ - C++ 中何时引入了左值引用?

c++ - 在 C++ 中读取/操作图像

c++ - 依赖于操作系统的 C++ 内存泄漏?

C++多重继承

c++ - 如何在 C++ 中手动初始化 std::list 的对象? class的指针有member list<>,不能new怎么办?

c++ - 在 C++ 中打印结构

c++ - C++20 的分支需要二进制补码

c++ - 将参数传递给父类(super class)构造函数

c++ - 在 Eclipse 中缩进函数大括号