传递 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 作为函数参数的主要内容,如果未能解决你的问题,请参考以下文章