2012-01-25 36 views
5

我只是写了一个函数:std :: string如何管理这个技巧?

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

但后来我把这个与

doSomeStuffWithTheString("foo"); 

和它的作品。所以我会认为这是行得通的(一个const char *来初始化一个std :: string的隐式实例)该值将不得不通过值传递,但在这种情况下通过(const)引用传递。

是否有任何机会一个隐式的时间std ::字符串实例从const char *当引用是常量?如果没有,那么这可能如何工作?

编辑

如果函数与

void doSomeStuffWithTheString(const char* value); 

哪一个会选择编译器超载会发生什么?

+0

你几乎回答了你自己的问题:) – pezcode

+0

有趣,不知道。什么是对象需要这样做会有这样的隐式构造函数发生在const-by-ref调用上(以及如何避免它)? – lurscher

+1

程序格式不正确:'std :: string = value;'无效并且应该被你的编译器拒绝。 –

回答

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"); 
0

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

0

恰好,使用std::string默认的构造

0

“的值将不得不由值来传递,但是在这种情况下,通过(常数)引用传递”。

有一个C++特征,其中有可能通过临时值(在这种情况下,临时std::stringconst char *隐式转换)到的常量引用的参数(在这种情况下,const std::string &)型。