Допустим, у меня есть функция foo(string& s)
, Если бы я получил C string
, foo(char* s)
Я бы просто назвал функцию как foo("bar")
,
Интересно, смогу ли я как-нибудь это сделать в C++ String
?
Как-то сократить это:
string v("bar");
foo(v)
Я использую Linux GCC C ++.
Это не работает, потому что аргумент должен быть const
ссылка:
void foo( const std::string& s )
// ^^^^^
foo( "bar" ); // will work now
foo
читать только из аргумента, который вы должны написать foo(const string& s)
, foo
чтобы сохранить строку где-нибудь (член класса ..) вы должны написать foo(string s)
, Обе версии позволяют писать foo("bar");
что не имеет никакого смысла с неконстантной ссылкой.
Вы также можете попробовать foo(string("bar"));
чтобы получить желаемые результаты, но так как он ожидает ссылки, это тоже не сработает.
Это означает, что ваша лучшая ставка — это перегрузка для const char *
вызвать строковый метод (таким образом, вы поддерживаете только один метод).
std::string
класс имеет неявное преобразование из const char*
обычно передача строкового литерала в функцию std::string
работает просто отлично.
Почему в вашем случае происходит сбой, так это то, что функция принимает свой параметр как неконстантную ссылку на значение, и, таким образом, она требует фактического std::string
Я хочу оперировать.
Если функция на самом деле хочет получить неконстантную ссылку на lvalue (т.е. она изменяет аргумент), вы должны создать lvalue std::string
и передать его (как и вы).
Если функция не изменяет аргумент, измените его на const-reference (const std::string&
) или по значению (std::string
) вместо; для обоих из них, передавая значение (например, std::string
созданный неявным преобразованием из const char*
) будет работать, и вы можете вызывать функцию со строковыми литералами.