2013-07-30 23 views
0

这样的:字符串(“abc”)是否返回任何内容?

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

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

+11

它是一个字符串类型的临时对象。因为字符串不包含在内,所以我也感到惊讶 – Borgleader

+1

你还希望能够调用它的大小吗? – Doorknob

+3

它是'std :: string'类型的匿名对象。 – abiessu

回答

9

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

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

使用例如:

int()           // 0 
(string()+=string("123")+="abc").substr(1,3) // "23a" 
+7

它不返回'T &&',它返回'T',但它是一个右值。如果它返回'T &&',那么它会有一个悬而未决的参考。您将* types *与* value categories *混淆。 – Rapptz

+1

@Rapptz - 答复已被重写,谢谢。 –

+0

这里根本没有“回归”。 'string(“123”)'是一个函数式case表达式,它有一个类型(':: std :: string'),一个值类别(prvalue)和一个值。 –

4

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

现在,有多种类型的值,在这种情况下,我想区分l值和r值。我会通过例如这样做:

#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; 
} 

正如你可以看到here,这个打印如下:

l-value reference 
r-value reference 

不同的是,第二字符串,是一个临时对象,因而一个r值,所以调用r值参考的过载。

所以我试图做的一点是临时和非临时字符串都很好,字符串。区别只在于一个是暂时的,另一个不是。因此,可以通过例如使用用于I值参考和R值参考的过载来区分I值和R值。

对于值类型之间的差异的解释是指this page

+0

对std :: string的构造函数有一个隐式调用,但string(“abc”)是一个函数式的转换表达式。 'string'在这里命名类型。我不会说'string(“abc”)'“显然”是对字符串构造函数的调用。 –

+0

@CharlesBailey谢谢你指出,为了清晰 – Borgleader

0

它返回到在存储器中的构造的对象,在其上调用方法size()参考。

相关问题