首页 > 解决方案 > muQueue.front() 给出了 const 实例,即使我没有将它标记为 const

问题描述

我在这个程序中遇到问题:

#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<unsigned char *, libopenvpn::GenericObjectHolder>”,但函数未标记为 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]
 

我相信这是同样的错误。看起来好像是这样,b被标记为const即使我没有在任何地方使它成为 const 。

为什么是常量?

标签: c++

解决方案


默认情况下,任何由 lambda 中的值捕获的变量都是const.

如果将 lambda 标记为,mutable则捕获b的不再是 const:

tasks.emplace( [b] () mutable {
       b.consumed(0);
});

这是一个演示

此外,通过引用捕获的变量是非常量的,因此您可以b通过引用捕获:

tasks.emplace( [&b] () {
       b.consumed(0);
});

这是一个演示


推荐阅读