将const char作为函数参数传递而非std::string

14

这是一个新手问题,但我不理解它是如何工作的。

假设我有以下函数:

void foo(const std::string& v) {
    cout << v << endl;
}

以下是我程序中的调用代码。

foo("hi!");

实质上,我将一个const char*传递给一个对字符串进行const引用的函数参数,因此我对这个调用有疑问。

为了通过引用传递参数,我是否正确地说变量必须至少在调用期间存在?如果是这样,那么传递给函数的字符串在哪里创建?

我可以看到它起作用:这是因为编译器创建了一个临时的string,它被传递给参数或函数吗?


2
你的假设是正确的,它创建了一个临时的std::string。另一种方法是使用string_view/string_ref,它可以同时保存const char*std::string,而不需要进行复制(参考链接:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3849.html或者http://www.boost.org/doc/libs/1_55_0/libs/utility/doc/html/string_ref.html)。 - dalle
1个回答

21

这是因为编译器创建了一个临时字符串,将其传递给参数或函数吗?

是的,临时变量可以绑定到const左值引用。临时字符串v在函数调用期间是存在的。

需要注意的是,这是可能的,因为std::string具有使用const char*参数的隐式转换构造函数。这也是使下面代码可能的相同的构造函数:

std::string s = "foo";

5
它之所以能够工作,是因为构造函数没有被声明为显式。 - CashCow
嗨,juanchopanza。非常感谢您的解释。 - Abruzzo Forte e Gentile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接