передача параметров — любой способ сократить тип String в C ++?

Допустим, у меня есть функция foo(string& s), Если бы я получил C string, foo(char* s)Я бы просто назвал функцию как foo("bar"),
Интересно, смогу ли я как-нибудь это сделать в C++ String?

Как-то сократить это:

string v("bar");
foo(v)

Я использую Linux GCC C ++.

1

Решение

Это не работает, потому что аргумент должен быть const ссылка:

void foo( const std::string& s )
//        ^^^^^

foo( "bar" );  // will work now
4

Другие решения

  • Если ты хочешь foo читать только из аргумента, который вы должны написать foo(const string& s),
  • Если ты хочешь foo чтобы сохранить строку где-нибудь (член класса ..) вы должны написать foo(string s),

Обе версии позволяют писать foo("bar"); что не имеет никакого смысла с неконстантной ссылкой.

1

Вы также можете попробовать foo(string("bar")); чтобы получить желаемые результаты, но так как он ожидает ссылки, это тоже не сработает.

Это означает, что ваша лучшая ставка — это перегрузка для const char * вызвать строковый метод (таким образом, вы поддерживаете только один метод).

1

std::string класс имеет неявное преобразование из const char*обычно передача строкового литерала в функцию std::string работает просто отлично.

Почему в вашем случае происходит сбой, так это то, что функция принимает свой параметр как неконстантную ссылку на значение, и, таким образом, она требует фактического std::string Я хочу оперировать.

Если функция на самом деле хочет получить неконстантную ссылку на lvalue (т.е. она изменяет аргумент), вы должны создать lvalue std::string и передать его (как и вы).

Если функция не изменяет аргумент, измените его на const-reference (const std::string&) или по значению (std::string) вместо; для обоих из них, передавая значение (например, std::string созданный неявным преобразованием из const char*) будет работать, и вы можете вызывать функцию со строковыми литералами.

0
По вопросам рекламы [email protected]