On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 20:07. Заголовок: MS VC++ 2010: баг в стандартной библиотеке С++ для std::to_string


Исходное сообщение, из которого я узнал об этом баге, было опубликовано программистом с ником o_O на данном форуме.

Этот баг связан с семейством функций std::to_string, позволяющих преобразовывать значения арифметических типов в объекты класса std::string.
Например, если вы хотите значение, хранящееся в переменной типа int, занести в объект типа std::string, то вы могли бы использовать следующий код:

 int x = 42; 

std::string s = to_string( x );



Это очень удобные функции, которые унифицируют подобные операции преобразования значений арифметических типов в символьные строки.

Однако если вы захотите выполнить приведенный пример с помощью компилятора MS VC++ 2010, у вас ничего не получится. Компилятор выдаст совершенно неожиданные сообщения об ошибках:


 цитата:
error C2668: std::to_string: неоднозначный вызов перегруженной функции
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(688): может быть "std::string std::to_string(long double)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(680): или "std::string std::to_string(_ULonglong)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(672): или "std::string std::to_string(_Longlong)"
1> при попытке сопоставить список аргументов "(int)"
может быть "std::string std::to_string(long double)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(680): или "std::string std::to_string(_ULonglong)"
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(672): или "std::string std::to_string(_Longlong)"
1> при попытке сопоставить список аргументов "(int)"



Как видно из этих сообщений, компилятор не знает, какую из трех перегруженных функций выбрать.

Проблема в том, что в библиотеке MS VC++ 2010 не объявлена такая функция для типа параметра int! Имеются лишь следующие объявления:

 inline string to_string(_Longlong _Val); 
inline string to_string(_ULonglong _Val);
inline string to_string(long double _Val);


где имена _Longlong и _ULonglong определены как

 #define _LONGLONG    __int64 
#define _ULONGLONG unsigned __int64


Поэтому при выполнении кода

 int x = 42; 

std::string s = to_string( x );

компилятор не знает, какую из трех функций использовать для вызова.

Напомню, что в соответствии со стандартом С++ 2011 должны быть определены следующие функции


 цитата:
string to_string(int val);
string to_string(unsigned val);
string to_string(long val);
string to_string(unsigned long val);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);



Я написал сообщение об этом баге в Майкрософт с согласия o_O и получил от них следующий ответ:


 цитата:
Posted by Microsoft on 29.05.2012 at 19:54

Hi,

Thanks for reporting this bug. We've already fixed it, and the fix will be available in VC11 RTM.

You may be interested to learn that this bug was caused by VC10 following an earlier version of the C++0x Working Paper, which specified too few overloads for to_string(). This was fixed in the final version of the C++11 Standard, and we've changed VC11's implementation accordingly.

If you have any further questions, feel free to E-mail me at xxxxxxxxx.

Stephan T. Lavavej
Visual C++ Libraries Developer



P.S. Я скрыл электронный адрес, указанный в ответном письме от майкрософт, так как, думаю, не следует его делать открытым для всех любителей спама.

Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 2
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет