Это хорошая практика, чтобы передать `char []` в функцию, которая принимает `std :: string &` - PullRequest
0 голосов
/ 17 ноября 2018

Я не сталкиваюсь с какими-либо проблемами с кодом ниже, но это хорошая практика для передачи char [] в функцию, которая принимает std::string& в качестве параметра

 const char* function(std::string& MyString)
 {
    MyString = "Hello World";
    return MyString.c_str();
 }

 int main()
 {
    char MyString[50];

    /*
    *Is it good practice to cast like this?
    *what possible issues i could face because of this casting?
    */
    function((std::string)MyString);                  

    std::cin.get();
    return 0;
 }

Ответы [ 3 ]

0 голосов
/ 17 ноября 2018

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

Теперь, как написано, вы получите ошибку (по крайней мере, с неработающим компилятором), поскольку вы не можете передать временный объект в неконстантную ссылку на lvalue.Но если вы измените функцию на const std::string &, она будет работать просто отлично.

Также плохая практика - возвращать char *, который вы получаете, вызывая std :: string :: c_str () - этоУказатель будет действителен только до тех пор, пока строковый объект не будет изменен или уничтожен - поэтому возвращаемый указатель станет недействительным (зависшим), как только временная переменная, переданная вами в качестве аргумента, будет уничтожена.Если вы сохраните этот возвращенный указатель в локальной переменной в main, а затем попытаетесь что-то с ним сделать (например, распечатать его), это будет неопределенным поведением.

0 голосов
/ 17 ноября 2018

За короткое время char[] для функции приема строки является обычной практикой (из C).И это не плохо.Явное приведение здесь не очень хорошо.Функция также не хороша, так как она не принимает прохождение char[] ...

0 голосов
/ 17 ноября 2018

Это просто не будет работать, потому что это потребует создания временного std::string, который не может быть привязан к ссылке на l-значение. Даже если бы функция взяла ссылку на std::string const, создание временного параметра повлияло бы на производительность. Таким образом, в зависимости от характера функции может быть хорошей идеей добавить перегрузку, которая также принимает указатель на c-строку. В качестве альтернативы, если функция не собирается изменять строку, вы можете заставить ее принять std::string_view, чтобы она могла обрабатывать как std::string, так и c-строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...