繁体   English   中英

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

[英]Is it good practice to pass `char []` to a function which accepts `std::string&`

我没有遇到以下代码的任何问题,但将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;
 }

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

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

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

同样不好的做法是返回char *这是通过调用std :: string :: c_str()获得的-只有在未修改或销毁字符串对象的情况下,此指针才有效-因此返回的指针将变为无效(晃来晃去),您作为参数传递的温度很快就被破坏了。 如果要将返回的指针保存在main中的局部变量中,然后尝试对其进行处理(如打印),那将是未定义的行为。

简而言之,将char[]传递给函数接受字符串是常见的做法(来自C)。 而且还不错。 显式转换在这里不好。 该函数也不好,因为它不接受传递char[] ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM