Технически ваш код в порядке.
НО вы написали таким образом, чтобы было легко взломать кого-то, кто не знает код Для c_str () единственное безопасное использование - когда вы передаете его в качестве параметра функции. В противном случае вы можете столкнуться с проблемами обслуживания.
Пример 1:
{
std::string server = "my_server";
std::string name = "my_name";
Foo foo;
foo.server = server.c_str();
foo.name = name.c_str();
//
// Imagine this is a long function
// Now a maintainer can easily come along and see name and server
// and would never expect that these values need to be maintained as
// const values so why not re-use them
name += "Martin";
// Oops now its broken.
// We use foo
use_foo(foo);
// Foo is about to be destroyed, before name and server
}
Так что для обслуживания сделайте это очевидным:
Лучшее решение:
{
// Now they can't be changed.
std::string const server = "my_server";
std::string const name = "my_name";
Foo foo;
foo.server = server.c_str();
foo.name = name.c_str();
use_foo(foo);
}
Но если у вас есть константные строки, они вам на самом деле не нужны:
{
char const* server = "my_server";
char const* name = "my_name";
Foo foo;
foo.server = server;
foo.name = name;
use_foo(foo);
}
OK. Почему-то вы хотите их в виде строк:
Почему бы не использовать их только при звонке:
{
std::string server = "my_server";
std::string name = "my_name";
// guaranteed not to be modified now!!!
use_foo(Foo(server.c_str(), name.c_str());
}