将`char []`传递给接受`std :: string&`的函数是一种好习惯吗?

时间:2018-11-17 07:55:19

标签: c++ arrays string pointers

下面的代码不会遇到任何问题,但是将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 :(得分:3)

这根本行不通,因为它将需要创建不能绑定到L值引用的临时std::string。即使函数引用了std::string const临时文件的创建也会影响性能。因此,根据函数的性质,最好添加一个也接受指向c字符串的指针的重载。或者,如果函数不打算修改字符串,则可以使其接受std::string_view,以便它可以处理std::string和c字符串。

答案 1 :(得分:1)

不,这是错误的做法,因为强制转换无效; std::string可以使用非显式构造函数从char *进行构造,因此您可以删除强制类型转换,并获得完全相同的代码(只是使用隐式构造而不是显式强制转换)

现在,由于无法将临时对象传递给非常量左值引用,因此您将收到错误(至少对于不中断的编译器而言)。但是,如果您将函数更改为采用const std::string &,它将可以正常工作。

还有一种不好的做法,就是通过调用std :: string :: c_str()返回您所获得的char * -仅在未修改或销毁字符串对象的情况下,此指针才有效-因此,返回的指针将在您作为参数传递的临时变量被销毁后立即变为无效(悬空)。如果要将返回的指针保存在main中的局部变量中,然后尝试对其进行处理(如打印),那将是未定义的行为。

答案 2 :(得分:1)

简而言之,通常将a = 1.0 / a传递给函数接受字符串(来自C)。而且还不错。显式转换在这里不好。该功能也不好,因为它不接受传递char[] ...