[英]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.