5

我刚刚写了一个函数:

void doSomeStuffWithTheString(const std::string& value) {
...
std::string v = value;
std::cout << value.c_str();
...
}

但后来我称之为

doSomeStuffWithTheString("foo");

它有效。所以我会认为这可以工作(一个 const char* 来初始化 std::string 的隐式实例)该值必须按值传递,但在这种情况下是通过 (const) 引用传递的。

当引用为 const 时,是否有可能从 const char* 实例化隐式时间 std::string?如果没有,那么这可能如何工作?

编辑

如果函数重载会发生什么

void doSomeStuffWithTheString(const char* value);

哪一个会选择编译器?

4

4 回答 4

7

std::string类型具有来自 的隐式转换(通过构造函数)const char*。这就是允许字符串文字"foo"转换为std::string. 这会产生一个临时值。在 C++ 中,拥有一个临时值是合法的const &,因此这一切都保持在一起。

可以在 C++ 中使用您自己的自定义类型来复制此技巧。

class Example {
public:
  Example(const char* pValue) {}
};

void Method(const Example& e) {
  ...
}

Method("foo");
于 2012-01-25T16:50:27.517 回答
0

是的,临时std::string是从字符串文字构造的。

于 2012-01-25T16:49:39.403 回答
0

没错,使用std::string默认构造函数

于 2012-01-25T16:51:19.277 回答
0

“该值必须按值传递,但在这种情况下是通过 (const) 引用传递的。”

有一个 C++ 功能可以将临时值(在本例中为std::string从 隐式转换的临时值const char *)传递给 const-reference(在本例中为const std::string &)类型的参数。

于 2012-01-25T23:14:14.563 回答