_HAS_ITERATOR_DEBUGGING
次のコードは、マクロが等しい場合、C++Builder 2009 または Visual C++ 2005 ではコンパイルされません1
が、コメント アウトされている場合はコンパイルされます。関数がlower_bound
仕様に準拠していないようです。ライブラリは引数を交換しています。仕様書の抜粋です。value
常に 2 番目の引数にする必要があります。私が間違っている?
注: テスト コードは、実行するようには設計されていません。これは、ライブラリのバグを説明するために設計されました。
C++ 仕様の抜粋
template<class ForwardIterator, class T, class Compare>
ForwardIterator
lower_bound(ForwardIterator first,
ForwardIterator last,
const T& value,
Compare comp);
25.3.3.1.3
戻り値: 範囲 [first, last] 内の最も遠い反復子 i (ただし、範囲 [first, i) 内の任意の反復子 j に対して、次の対応する条件が保持されます: *j < 値または comp(*j, 値) != false
Visual Studio のエラー メッセージ
メッセージ: エラー C2664: 'double mike::operator ()(const double,const char *) const': パラメーター 1 を 'const char [1]' から 'const double' に変換できません
ファイル: c:\program files\microsoft Visual Studio 8\vc\include\xutility
ライン番号: 314
テストコード
#define _HAS_ITERATOR_DEBUGGING 1 // needs to be in the stdafx.h file for Visual Studio
#include "stdafx.h"
#include <algorithm>
#include <functional>
struct mike : public std::binary_function<double, char*, double> {
double operator() (const double i, const char*) const {
return i;
}
};
int main()
{
double r[] = {0};
std::lower_bound(r, r, "", mike());
return 0;
}