从这个链接,它说
对象,引用,函数(包括函数模板特化)和表达式都有一个名为type的属性
所以给出以下内容:
int &&rf_int = 10;
Run Code Online (Sandbox Code Playgroud)
我可以说变量rf_int是对int的复合类型rvalue引用.
但在谈论价值类别时,它具体说明了这一点
每个表达式都有一些非引用类型
和
每个C++表达式(具有操作数,文字,变量名等的运算符)
基于以上两个语句,rf_int可以视为表达式和表达式具有非引用类型.
现在我真的很困惑.是否rf_int有引用类型?在谈论名称的类型时,我们是否必须提供上下文,无论是变量还是表达式?
更具体地说,当在函数调用中使用变量名时:
SomeFunc(rf_int);
Run Code Online (Sandbox Code Playgroud)
是rf_int目前被认为是一个表达式(因此它是与int类型左值),或者一个变量(因此它与类型右值参考左值为int)?
编辑:这里的评论让我想知道这个问题.
在尝试编写有关移动构造函数的示例后,我遇到了以下代码:
#include <utility>
#include <iostream>
using namespace std;
class Data
{
public:
Data()
: x (3)
{
cout << "Data()" << endl;
}
Data(Data&&)
: x(4)
{
cout << "Data(&&)" << endl;
}
int x;
};
int main()
{
Data a;
Data b (std::move(a));
cout << b.x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么移动构造函数不在这里调用?程序打印:
数据()
3
我发现甚至更奇怪的是,通过添加一个复制构造函数,突然,它确实调用了移动构造函数...
Data(const Data&)
: x(2)
{
cout << "Data(copy)" << endl;
}
Run Code Online (Sandbox Code Playgroud)
现在它将打印出来
数据(&&)
4
PS我正在使用gcc 4.4.5
我无法理解右值引用的工作原理。我有以下代码:
void f(int&& i)
{}
int main()
{
int i = 42;
int&& r = std::move(i);
f(r);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这里,我收到以下编译器错误:
prog.cpp: In function ‘int main()’:
prog.cpp:46:7: error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘int’
f(r);
^
prog.cpp:38:6: note: initializing argument 1 of ‘void f(int&&)’
void f(int&& i)
^
Run Code Online (Sandbox Code Playgroud)
当我显式声明r为右值引用时,为什么编译器认为我正在传递左值?这样做f(std::move(r))似乎有效,但我仍然不明白那里有什么不同。
这是因为在f(r)调用中r被视为左值吗?如果是,是什么类型的std::move(r)?