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

时间:2013-07-30 05:17:47

标签: c++ return

像这样:

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

string("abc")会返回任何内容吗?如果是,那是值还是参考?

3 个答案:

答案 0 :(得分:9)

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

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

使用示例:

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

答案 1 :(得分:4)

所以string("abc")最终会调用string的构造函数。在这种情况下,这个“返回”(引号在这里很重要,构造函数在技术上不返回任何东西)是一个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值引用的重载。

所以我要说的是临时和非临时字符串都很好,字符串。不同之处仅在于一个是暂时的而另一个不是。因此,可以通过例如使用l值参考和r值参考的重载来区分l值和r值。

有关值类型之间差异的说明,请参阅this page

答案 2 :(得分:0)

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