STL アルゴリズムに渡すカスタム述語関数/ファンクターを作成する場合、述語はその引数のアドレスを使用できますか?
質問のきっかけとなった問題は次のとおりです。vectorと、 へのいくつかのインデックスを含むvecvectorがあります。にインデックスがリストされている要素を削除したいと思います。indsvecvecinds
1 つの方法として、アドレスを取得して引数のインデックスを決定remove_ifする述語ファンクターを使用する方法があります。InIndsvec
class InInds {
private:
const vector<Element>& vec_;
const vector<int>& inds_;
public:
InInds(const vector<Element>& vec, const vector<int>& inds)
: vec_(vec), inds_(inds) {}
bool operator()(const Element& element) {
// WARNING: uses the ADDRESS of element, not its value. May not be kosher?
int index = &element - &vec[0];
return std::find(inds_.begin(), inds_.end(), index) != inds_.end();
}
}
InIndsの要素で直接呼び出された場合に機能しvecます。elementコピーのアドレスはのインデックスを決定するのに役に立たないため、要素のコピーに対して呼び出されると壊れます。
私の質問は次のとおりです。この述語はremove_if、標準に準拠したコンパイラで機能しますか? それとも、述語はアドレスではなく、値のみを操作することを厳密に意図しているのでしょうか?