【发布时间】:2010-12-15 13:30:45
【问题描述】:
为什么我可以这样做:
stable_sort(it1, it2, binary_function);
但不是这个:
priority_queue<type, vector<type>, binary_function> pq;
为什么我可以在第一种情况下使用函数,但在第二种情况下需要一个对象?
【问题讨论】:
标签: c++ stl comparator predicates
为什么我可以这样做:
stable_sort(it1, it2, binary_function);
但不是这个:
priority_queue<type, vector<type>, binary_function> pq;
为什么我可以在第一种情况下使用函数,但在第二种情况下需要一个对象?
【问题讨论】:
标签: c++ stl comparator predicates
priority_queue 是一个模板,它需要一个类型作为参数,其中binary_function 是一个函数对象。
【讨论】:
decltype 从对象中检索类型(静态)
如果您查看std::stable_sort 上的引用,您会看到您提供的binary_function 也应该是一个函数对象......两者之间没有区别,除了可能在第二种情况下没有适当的“强制转换”或从函数到适当的函数对象的转换。
我相信这可能是因为*sort函数直接使用函子,并且立即,因此如果函数地址在*sort函数被调用时是有效的,它将在持续时间内有效函数调用。在创建使用 this 作为数据成员的容器时(本质上),您不能确定函数引用会在容器对象的生命周期内失效。我知道这是一个松散的挥手解释,但这是我能想到的最好的解释。或许在 C++ 中,对二进制函数的引用会被隐式转换为 std::function 的构造,这样函数就会被“复制”并且不存在有效性问题。
希望我现在没有失去你……
【讨论】:
binary_function 是函数对象实例的名称或函数的名称。因此,它不能用于模板参数必须是类型名称(不是变量/函数名称)的第二种情况。
bool operator( arg ) 的结构。否则它只是一个函数的地址,当然也可以使用,但在这种情况下恕我直言(由于该引用的未知生命周期问题)
MyFunctor fun; - MyFunctor 是类的名称,fun 是实例的名称。 stable_sort 采用fun(推导参数的类型),priority_queue 的模板参数采用MyFunctor