This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libstdc++-v3 HOWTO: Chapter 22


There is a bug in the Toupper example code 'http://gcc.gnu.org/onlinedocs/libstdc++/22_locale/howto.html'. In it, when constructing Toupper (in main***), the 'std::local("C")' is destructed immediately after the 'up' is constructed causing 'up::loc' reference to be invalid when std::transform is called. (dito Tolower..)

Simon

#include <iterator> // for back_inserter
#include <locale>
#include <string>
#include <algorithm>
#include <cctype> // old <ctype.h>

struct Toupper
{
Toupper (std::locale const& l) : loc(l) {;}
char operator() (char c) { return std::toupper(c,loc); }
private:
std::locale const& loc;
};


struct Tolower
{
Tolower (std::locale const& l) : loc(l) {;}
char operator() (char c) { return std::tolower(c,loc); }
private:
std::locale const& loc;
};


int main ()
{
std::string s ("Some Kind Of Initial Input Goes Here");
Toupper up ( std::locale("C") ); // ***
Tolower down ( std::locale("C") );


// Change everything into upper case
std::transform (s.begin(), s.end(), s.begin(),
up
);


// Change everything into lower case
std::transform (s.begin(), s.end(), s.begin(),
down
);


// Change everything back into upper case, but store the
// result in a different string
std::string capital_s;
std::transform (s.begin(), s.end(), std::back_inserter(capital_s),
up
);
}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]