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

前端之家收集整理的这篇文章主要介绍了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&C++相关文章