我刚刚写了一个函数:
void doSomeStuffWithTheString(const std::string& value) {
...
std::string v = value;
std::cout << value.c_str();
...
}
但我用称之为
doSomeStuffWithTheString("foo");
它是有效的。因此,我认为这是可行的(一个const char*来初始化std::string的隐式实例),值必须通过值传递,但在这种情况下是通过(const)引用传递的。
当引用为const时,是否有可能是从constchar*实例化的隐式时态std::字符串?如果没有,那么这怎么可能起作用呢?
编辑
如果使函数过载会发生什么
void doSomeStuffWithTheString(const char* value);
哪一个会选择编译器?
std::string
类型具有从const char*
的隐式转换(通过构造函数)。这就是允许字符串文字"foo"
转换为std::string
的原因。这将产生一个临时值。在C++中,将const &
设为临时值是合法的,因此这一切都成立。
可以在C++中使用自己的自定义类型来复制这个技巧。
class Example {
public:
Example(const char* pValue) {}
};
void Method(const Example& e) {
...
}
Method("foo");
是的,临时std::string
是根据字符串文字构造的。
没错,使用std::string
默认构造函数
"值必须通过值传递,但在这种情况下是通过(const)引用传递的。"
有一个C++特性,可以将临时值(在本例中,是从const char *
隐式转换而来的临时std::string
)传递给const-reference(在本案中,是const std::string &
)类型的参数。