【问题标题】:A const std::function wraps a non-const operator() / mutable lambda一个 const std::function 包装了一个非常量 operator() / 可变 lambda
【发布时间】:2017-11-04 19:50:05
【问题描述】:

考虑以下示例:

#include <iostream>
#include <functional>

struct A
{
    int i;
    void operator()() 
    {
        std::cout << ++i;
    }
};

void test(std::function<void()> const& fun)
{
    fun();
}

int main() {
    const std::function<void()> f{A{}};
    test(f);
    test(f);
}

这里,const std::function 可以调用非const operator()

输出:

12

如果我提供 mutable lambda,也会发生同样的情况,例如test([x = 0]() mutable { ++x; });

怎么可能?

const std::function 可能包装可变函子是否正常?

【问题讨论】:

    标签: c++ c++11 std-function


    【解决方案1】:

    const std::function 可以包装一个可变函子是否正常?

    不幸的是,是的。 std::function::operator() 无条件地限定为 const 并且不关心包装的 Callable 是否发生突变。一些论文试图解决这个问题,但 AFAIK 尚未做出任何具体决定:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-25
      • 2017-08-18
      相关资源
      最近更新 更多