gpt4 book ai didi

c++ - 未遵循 std::function const 正确性

转载 作者:可可西里 更新时间:2023-11-01 18:35:23 28 4
gpt4 key购买 nike

我惊讶地发现这段代码可以编译:

#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 auto cf = counter; cf(); 然后它会按预期出错。那么,为什么 std::function 似乎没有遵循 const 正确性?

最佳答案

std::function 增加了一层间接,这层间接不通过 constness 传递给可调用对象。

我不太确定为什么会这样——可能是因为 std::function 获取了可调用对象的拷贝并且不需要保留拷贝 const(在事实上这可能会破坏赋值语义)——我也不确定你为什么需要它。

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

最佳做法是给可调用对象一个 const operator() 并保留它。

tl;dr:是的,但不是错误,也没有关系

关于c++ - 未遵循 std::function const 正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53062655/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com