传递 const char 而不是 std::string 作为函数参数
Posted
技术标签:
【中文标题】传递 const char 而不是 std::string 作为函数参数【英文标题】:passing a const char instead of a std::string as function argument 【发布时间】:2014-02-19 21:08:26 【问题描述】:这是一个新手问题,但我不明白它是如何工作的。
假设我有下面这样的功能
void foo(const std::string& v)
cout << v << endl;
以及我程序中的以下调用。
foo("hi!");
基本上我将const char*
传递给一个函数参数,该参数是对字符串的常量引用,所以我对这个调用有疑问。
为了通过引用传递参数,我是否正确地说该变量必须至少在调用期间存在?如果是这样,传递给函数的字符串是在哪里创建的?
我可以看到它有效:它发生是因为编译器创建了一个临时的string
并传递给参数或函数吗?
【问题讨论】:
您的假设是正确的,它会创建一个临时的std::string
。另一种方法是使用string_view/string_ref
,它可以同时保存const char*
和std::string
而无需复制(open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3849.html 或boost.org/doc/libs/1_55_0/libs/utility/doc/html/string_ref.html)
【参考方案1】:
这是因为编译器创建了一个临时字符串并传递给参数或函数吗?
是的,并且允许临时对象绑定到const
左值引用。临时字符串v
在函数调用期间是活动的。
请注意,这是可能的,因为std::string
有一个带有const char*
参数的隐式转换构造函数。正是同一个构造函数使这成为可能:
std::string s = "foo";
【讨论】:
它可以工作,因为构造函数没有被声明为显式。 嗨 juanchopanza。非常感谢您的解释。以上是关于传递 const char 而不是 std::string 作为函数参数的主要内容,如果未能解决你的问题,请参考以下文章
为什么将`const char [N]`和`const char *`传递给view :: c_str()会产生不同的二进制文件,而string_view会产生相同的结果吗?
可以/为啥在返回类型中使用 char * 而不是 const char * 会导致崩溃?
为啥 ostream::write() 在 C++ 中需要“const char_type*”而不是“const void*”?
如何实现 initWithCString:(const char *)nullTerminatedCString ?为啥大多数人使用 allocWithZone 而不是 alloc?