Like most programming constructs, it's "safe" if you use it correctly, and it's not "safe" if you're sloppy. In this case, using it correctly means paying attention to object lifetimes. The + operator creates a temporary object which gets destroyed at the end of the statement, and the returned const char* is no longer valid after the statement that created it. So you can pass the result of c_str() directly to a function, but you can't save the pointer and use it later.