我编写了一个如下所示的通用函数模板,它不构建。
仅当谓词由const reference
或by value
传递时才构建。
你知道C ++在这种情况下遵循的原则是什么吗?
我正在使用g ++,而我的版本没有C ++ 11可用。
我已查看boost::bind
返回的内容,并显示unspecified type
(我希望已正确阅读)。
struct MyRecord{
int a_;
int b_;
};
template<class Predicate>
bool isAny(Predicate &pred) {
vector<MyRecord>::iterator it = std::find_if(
records.begin(),
records.end(),
pred);
if(it!=records.end()) {
// .. do something
}
return it != records.end();
}
isAny(boost::bind(&MyRecord::a_,_1)==1);
isAny(boost::bind(&MyRecord::b_,_1)==2);
// It works with the 2 declarations below
template<class Predicate>
bool isAny(const Predicate &pred);
// or
template<class Predicate>
bool isAny(Predicate pred);
答案 0 :(得分:3)
您的电话isAny(boost::bind(&MyRecord::a_,_1)==1);
会创建一个临时对象。在C ++中,临时只能绑定到const引用参数或值参数。这个想法是,如果一个函数通过非const引用获取参数,则意味着修改参数,修改临时参数将毫无意义。
FWIW STL按值计算谓词。