gpt4 book ai didi

c++ - 为什么 std::function 构造函数或赋值之间存在差异?

转载 作者:可可西里 更新时间:2023-11-01 17:57:26 31 4
gpt4 key购买 nike

std::function 类型删除构造函数定义为:

template< class F >
function( F f );

赋值运算符定义为:

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

(来源 cppreference)

为什么构造函数通过值获取f,而operator=通过转发引用获取f

最佳答案

我只能猜测,但我猜这是因为它被添加到 C++ 而右值引用和转发引用被添加到语言中。

因此其 API 的某些部分获得了转发引用,而另一些则没有。

有一个小优点:如果 F 的复制构造函数可以扔而移动不能,std::function( F )可以保证不抛出,而std::function( F const& )不可能是。不同之处在于复制将在 template<class F> function(F) 中的构造函数之外完成。案例,但在 template<class F> function(F&&) 的构造函数内部传递非右值时的情况。

这不是一个令人信服的理由。

这也会使指定 function(F) 的 SFINAE 行为稍微容易一些。 ,但这在 C++11 之后很久才正式化,所以这不是原因。

template<class F>function(F) 的成本低-- F 的一步在完美的转发版本上——所以它可能在任何人的优先级列表中都没有很高的改变(特别是因为它会导致 function(F) 的“可能抛出”测试发生微妙的变化,因此理论上可能会导致一些奇怪的要破解的代码)。

关于c++ - 为什么 std::function 构造函数或赋值之间存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39471396/

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