STL lower_bound не соответствует спецификации - PullRequest
1 голос
/ 21 июля 2011

Следующий код не компилируется в C ++ Builder 2009 или Visual C ++ 2005, когда макрос _HAS_ITERATOR_DEBUGGING равен 1, но если закомментирован, он будет. Похоже, что функция lower_bound не соответствует спецификации. Библиотека меняет аргументы. Вот выдержка из спецификации. value всегда должен быть вторым аргументом. Я не прав?

ПРИМЕЧАНИЕ. Тестовый код не предназначен для запуска. Он был разработан, чтобы проиллюстрировать ошибку библиотеки.

C ++ Spec выдержка

template<class ForwardIterator, class T, class Compare>
ForwardIterator
lower_bound(ForwardIterator first, 
            ForwardIterator last, 
            const T& value, 
            Compare comp);

25.3.3.1.3

Возвращает: Самый дальний итератор i в диапазоне [first, last] такой, что для любого итератора j в диапазоне [first, i) выполняются следующие соответствующие условия: * j

Сообщение об ошибке 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;
}

1 Ответ

7 голосов
/ 21 июля 2011

Это известная проблема в реализации стандартной библиотеки Visual C ++ 2005 C ++ (см. «Параметр двоичного предиката для lower_bound предполагает, что оба параметра имеют одинаковый тип при компиляции в режиме отладки» в Microsoft Connect ).

Ошибка была исправлена ​​в Visual C ++ 2008.

...