【发布时间】:2012-03-13 05:54:58
【问题描述】:
我不确定 const 修饰符和引用在 std::function 的模板参数中的效果。例如,在下面的代码中,我应该使用std::function<bool(std::string, std::string)> 还是std::function<bool(const std::string&, const std::string&)> 作为基类?我在 GCC 4.4 中测试了两者,但是没有区别。提前致谢。
#include <iostream>
#include <functional>
#include <string>
//struct FLess : public std::function<bool(std::string, std::string)>
struct FLess : public std::function<bool(const std::string&, const std::string&)>
{
bool operator () (const std::string& s1, const std::string& s2) const
{
return s1 < s2;
}
};
int main(int argc, char* argv[])
{
FLess f;
std::string a = "a";
std::string b = "b";
std::cerr << f(a, b) << std::endl;
return 0;
}
【问题讨论】:
-
从技术上讲,您都不应该使用。您根本不应该从
std::function派生。你没有从超载中获得任何好处。它看起来更像是你想把你的FLess类inside 放在std::function中,而不是从它派生而来。 -
致@NicolBolas,我记得在C++03 中,如果函数不是从
std::unary_function或std::binary_function派生的,它在某些需要诸如first_argument_type之类的类型的情况下可能会失败,result_type待定义。所以我在 C++11 中以类似的方式使用它(源自std::function)。 -
@YunHuang:
std::function与那些旧的(现在已弃用的)类非常不同,从它继承很可能会引起混淆。很容易分割你的类并丢失运算符重载 - 但没有编译器错误,只是奇怪的运行时行为。如果你真的需要使用像result_type这样需要 typedef 的遗留代码,你最好自己定义它们,或者可能继承自std::binary_function。 -
+1 好问题,虽然你的例子中的继承混淆了这个问题。
标签: c++ function c++11 constants