Warning beheben: C4244 bei transform(..., ::toupper)
Wer in Visual Studio 2017 die c++ std lib benutzt und mit Warning Level 4 arbeitet kann teilweise böse Überraschungen erleben.
Eine davon ist folgende Warnung
c:\program files (x86)\microsoft visual studio\2017\enterprise\vc\tools\msvc\14.14.26428\include\algorithm(1404): warning C4244: '=': conversion from 'int' to 'char', possible loss of data
Bei mir trat es in einer transform Funktion auf:
std::string& doToUpper(std::string& sToMakeUpper)
{
std::transform(sToMakeUpper.begin(), sToMakeUpper.end(), sToMakeUpper.begin(), ::toupper);
return sToMakeUpper;
}
Zum Beheben des Fehlers muss der Rückgabewert von der Funktion toupper in einer eigenen Funktion gecastet werden:
inline char w4_toupper(int c) { return static_cast<char>(::toupper(c)); }
std::string& doToUpper(std::string& sToMakeUpper)
{
std::transform(sToMakeUpper.begin(), sToMakeUpper.end(), sToMakeUpper.begin(), w4_toupper);
return sToMakeUpper;
}
Danach kompiliert die funktion ohne Warning.