一个 const std::function 包装一个非常量 operator() / 可变 lambda
A const std::function wraps a non-const operator() / mutable lambda
考虑以下示例:
#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
可以包装可变函子是否正常?
Is it normal that a const std::function
may wrap a mutable functor?
不幸的是,是的。 std::function::operator()
无条件限定为 const
并且不关心包装的 Callable
是否发生变异。一些论文试图解决这个问题,但据我所知,还没有任何具体的决定:
考虑以下示例:
#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
可以包装可变函子是否正常?
Is it normal that a
const std::function
may wrap a mutable functor?
不幸的是,是的。 std::function::operator()
无条件限定为 const
并且不关心包装的 Callable
是否发生变异。一些论文试图解决这个问题,但据我所知,还没有任何具体的决定: