#include <iostream>
using namespace std;
int main()
{
if ( string( "abc" ).size() == 3 )
cout << "equ." << endl;
return 0;
}
string("abc")
会返回任何内容吗?如果是,那是值还是参考?
答案 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()
方法。