gpt4 book ai didi

c++ - 为什么我可以将接受值的可调用对象传递给接受引用的 std::function?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:28 24 4
gpt4 key购买 nike

当我声明一个变量时 function<void(const Foo&)> ,编译器仍然允许我分配一个接受值的 lambda:

function<void(const Foo&)> handler;
handler = [](Foo f){};

(参见 http://cpp.sh/5dsp)

因此当处理程序被调用时,会生成一个拷贝。标准的哪一部分允许这样做?有没有一种方法可以标记客户端代码这将是一个问题(某种 static_assert 之类的?)?

最佳答案

根据 [func.wrap.func.con]

std::function<R(ArgTypes...)>

有一个

template<class F> function& operator=(F&& f);

附上以下备注:

This assignment operator shall not participate in overload resolution unless decay_t<F> is Lvalue-Callable for argument types ArgTypes... and return type R.

在哪里

A callable type F is Lvalue-Callable for argument types ArgTypes and return type R if the expression INVOKE<R>(declval<F&>(), declval<ArgTypes>()...), considered as an unevaluated operand, is well formed.

所以你可以分配给一个std::function<R(ArgTypes...)>任何可用 ArgTypes... 调用的函数并返回可隐式转换为 R 的内容.

我不知道如何防止这种缺少包装 std::function 的情况发生在更有限的范围内。

关于c++ - 为什么我可以将接受值的可调用对象传递给接受引用的 std::function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46238315/

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