c – std :: function const正确性未遵循

我惊讶地发现这段代码编译:
#include <functional>

struct Callable {
    void operator() () { count++; }
    void operator() () const = delete;
    int count = 0;
};

int main() {
    const Callable counter;
    // counter(); //error: use of deleted function 'void Callable::operator()() const'
    std::function<void(void)> f = counter;
    f();

    const auto cf = f;
    cf();

}

https://wandbox.org/permlink/FH3PoiYewklxmiXl

这将调用Callable的非const调用操作符.相比之下,如果你做const auto cf = counter; CF();然后它按预期出错.那么,为什么const正确性似乎没有跟着std :: function?

解决方法

std :: function添加一个间接层,这个间接层不会通过constness传递给callable.

我不太确定为什么会这样 – 可能是因为std :: function需要一个调用的副本而且不需要保留副本const(实际上这可能会破坏赋值语义) – 我也不确定你为什么这么做我需要它.

(当然,直接调用一个类型的对象上的operator(),你恰好调用Callable并声明为const将需要一个const上下文,就像对任何其他对象一样.)

最佳做法是给callable一个const运算符()并保留它.

tl; dr:是的,但不是一个bug,并不重要

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...