调用 std::function 我也有一个 const 引用

Calling a std::function that I have a const reference too

我有点困惑地发现这段代码编译运行并打印出 1 2 3:

#include <functional>
#include <iostream>

int main() {
    std::function<int()> counter = [i = 0]() mutable { i++; return i; };
    std::cout << counter() << std::endl;

    const auto& constRef = counter;
    std::cout << constRef() << std::endl;
    std::cout << counter() << std::endl;
}

当我们只持有 const&std::function 时,能够调用底层函数的非常量 operator() 似乎违反了常量正确性。有什么我想念的吗?

godbolt link

it's call operator 的唯一重载是

std::function<R(Args...)>::operator()( Args... args ) const;

它不会将 const 传播到它的目标。