Форум » C/C++ » MS VC++ 2010: баг в стандартной библиотеке С++ для std::to_string » Ответить

MS VC++ 2010: баг в стандартной библиотеке С++ для std::to_string

Сыроежка: Исходное сообщение, из которого я узнал об этом баге, было опубликовано программистом с ником o_O на данном форуме. Этот баг связан с семейством функций std::to_string, позволяющих преобразовывать значения арифметических типов в объекты класса std::string. Например, если вы хотите значение, хранящееся в переменной типа int, занести в объект типа std::string, то вы могли бы использовать следующий код: [pre2] int x = 42; std::string s = to_string( x );[/pre2] Это очень удобные функции, которые унифицируют подобные операции преобразования значений арифметических типов в символьные строки. Однако если вы захотите выполнить приведенный пример с помощью компилятора MS VC++ 2010, у вас ничего не получится. Компилятор выдаст совершенно неожиданные сообщения об ошибках: [quote]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)"[/quote] Как видно из этих сообщений, компилятор не знает, какую из трех перегруженных функций выбрать. Проблема в том, что в библиотеке MS VC++ 2010 не объявлена такая функция для типа параметра int! Имеются лишь следующие объявления: [pre2] inline string to_string(_Longlong _Val); inline string to_string(_ULonglong _Val); inline string to_string(long double _Val);[/pre2] где имена _Longlong и _ULonglong определены как [pre2] #define _LONGLONG __int64 #define _ULONGLONG unsigned __int64[/pre2] Поэтому при выполнении кода [pre2] int x = 42; std::string s = to_string( x );[/pre2] компилятор не знает, какую из трех функций использовать для вызова. Напомню, что в соответствии со стандартом С++ 2011 должны быть определены следующие функции [quote]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);[/quote] Я написал сообщение об этом баге в Майкрософт с согласия o_O и получил от них следующий ответ: [quote]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 [/quote] P.S. Я скрыл электронный адрес, указанный в ответном письме от майкрософт, так как, думаю, не следует его делать открытым для всех любителей спама.

Ответов - 0



полная версия страницы