我刚写了一个函数:
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 *实例化的隐式temporal std :: string?如果没有,那么这可能如何运作?
修改
如果函数重载
会发生什么void doSomeStuffWithTheString(const char* value);
哪一个会选择编译器?
答案 0 :(得分: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");
答案 1 :(得分:0)
是的,临时std::string
是从字符串文字构建的。
答案 2 :(得分:0)
确切地说,使用std::string
默认构造函数
答案 3 :(得分:0)
“该值必须按值传递,但在这种情况下由(const)引用传递。”
有一个C ++特性,可以传递一个临时值(在这种情况下,从std::string
隐式转换的临时const char *
)到const-reference的参数(在这种情况下) ,const std::string &
)类型。