当一个字符串字面值作为const string&传递给函数时会发生什么?

3

这里是来自C++ Primer的一个例子: 一个名为count()的函数被声明为:

int count(const string & a, char b);

并被称为:

count("abcde", 'a')

它可以工作。这里的"abcde"是一个字符串字面量,并作为const string &传递给count()

但同时,这段代码

string & s="abcde";

之前的错误是因为我们不能将 string 字面量分配给 string &

那么当 "abcde" 被传递给 count() 时会发生什么呢?是否会有一个临时字符串被 "abcde" 初始化,然后传递给 count()


你的第二个例子不起作用,因为你省略了 const - Alan Stokes
1个回答

3

是否有像临时字符串被初始化为"abcde",然后传递给count()的东西吗?

是的,这正是发生的情况。

使用隐式构造函数(5)构造了一个std::string的临时实例。

 basic_string( const CharT* s,
               const Allocator& alloc = Allocator() );

对于你提供的第一个示例,它需要作为右值引用传递给函数。


至于你提供的第二个示例,使用一个const引用同样有效:

const std::string& s = "abcde";

查看演示

重点是左值引用不能从右值初始化。


我们可以认为这是编译器的智能还是愚蠢? - Nishant
@Nishant 这只是隐式构造函数的工作原理。一个简单的非const引用无法从rvalue初始化,仅此而已。 - πάντα ῥεῖ
我可以知道临时字符串创建的地址吗? - Nishant
@nishant,是的,你可以。 - Yakk - Adam Nevraumont
@Yakk 可疑,但是不知道该如何处理那个地址。我到目前为止还没有回应,因为实际上我不明白那个评论问题是关于什么的。 - πάντα ῥεῖ
@πάνταῥεῖ 当然,使用地址有几个好处。但是你可以通过多种方式获取临时变量的地址。 - Yakk - Adam Nevraumont

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