0

像这样:

#include <iostream>
using namespace std;
int main()
{
    if ( string( "abc" ).size() == 3 )
        cout << "equ." << endl;
    return 0;
}

有什么string("abc")回报吗?如果是这样,那是价值还是参考?

4

3 回答 3

9

类构造函数没有指定的返回类型,也没有返回语句。但是它们确实具有隐式返回类型-与声明它们的类相同,并且构造函数“返回”只是构造的对象。

T()调用默认构造函数并“返回”匿名prvalue类型T(绑定到T&&)。它的生命周期是使用它的表达式的生命周期。它是可修改的。

使用示例:

int()                                           // 0
(string()+=string("123")+="abc").substr(1,3)    // "23a"
于 2013-07-30T05:23:35.157 回答
4

所以string("abc")最终调用字符串的构造函数。在这种情况下,这个“返回”(引号在这里很重要,构造函数在技术上不返回任何东西)一个字符串类型的值。

现在,有多种类型的值,在这种情况下,我想区分左值和右值。我会举个例子:

#include <iostream>
#include <string>

void foo(std::string& s) { std::cout << "l-value reference" << std::endl; }
void foo(std::string&& s) { std::cout << "r-value reference" << std::endl; }

int main(int argc, char* argv[])
{
    std::string s;
    foo(s);
    foo(std::string());

    return 0;
}

正如您在此处看到的,这将打印以下内容:

l-value reference
r-value reference

不同之处在于,第二个字符串是一个临时对象,因此是一个 r 值,因此调用了采用 r 值引用的重载。

所以我想说的是,临时字符串和非临时字符串都很好,字符串。区别只是一个是暂时的,另一个不是。因此,可以区分左值和右值,例如通过对左值引用和右值引用使用重载。

有关值类型之间差异的说明,请参阅此页面

于 2013-07-30T05:53:40.300 回答
0

它返回对内存中构造对象的引用,您正在调用size()方法。

于 2013-08-01T09:03:30.157 回答