微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,并不重要

原文地址:https://www.jb51.cc/c/117926.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐