#include <iostream>
using namespace std;
int main()
{
if (string("abc").size() == 3)
cout << "equ." << endl;
return 0;
}
是否string("abc")
什么回报?如果是这样,那是价值还是参考?
#include <iostream>
using namespace std;
int main()
{
if (string("abc").size() == 3)
cout << "equ." << endl;
return 0;
}
是否string("abc")
什么回报?如果是这样,那是价值还是参考?
类的构造函数没有指定的返回类型,也没有返回语句。但他们确实有隐式返回类型 - 与声明它们的类相同,构造函数“返回”刚构造的对象。
T()
调用T
类型的默认构造函数和“返回”匿名prvalue
(它绑定到T&&
)。它的寿命是使用它的表达的一生。它是可修改的。
使用例如:
int() // 0
(string()+=string("123")+="abc").substr(1,3) // "23a"
它不返回'T &&',它返回'T',但它是一个右值。如果它返回'T &&',那么它会有一个悬而未决的参考。您将* types *与* value categories *混淆。 – Rapptz
@Rapptz - 答复已被重写,谢谢。 –
这里根本没有“回归”。 'string(“123”)'是一个函数式case表达式,它有一个类型(':: std :: string'),一个值类别(prvalue)和一个值。 –
所以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
对std :: string的构造函数有一个隐式调用,但string(“abc”)是一个函数式的转换表达式。 'string'在这里命名类型。我不会说'string(“abc”)'“显然”是对字符串构造函数的调用。 –
@CharlesBailey谢谢你指出,为了清晰 – Borgleader
它返回到在存储器中的构造的对象,在其上调用方法size()
参考。
它是一个字符串类型的临时对象。因为字符串不包含在内,所以我也感到惊讶 – Borgleader
你还希望能够调用它的大小吗? – Doorknob
它是'std :: string'类型的匿名对象。 – abiessu