传递 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?

为什么“auto”将字符串声明为const char *而不是std :: string?

将const引用/指针传递给类进行存储的首选方法,而不是复制引用的对象