从超过1的深度传递返回的右值引用时遇到问题.
struct Data {
std :: vector <int> data;
Data () {
data .push_back (1);
};
Data (Data && d)
: data (std :: move (d .data))
{}
};
Data && foo () {
Data d;
return std :: move (d);
}
Data && bar () {
return std :: move (foo ()); // Crashes in autogenerated code
}
Data && baz () {
return foo (); // Crashes in Data move constructor.
}
Data && bop () {
Data …Run Code Online (Sandbox Code Playgroud) 我想知道有一个方法返回一个r值.具体来说,我想知道是否有办法用重载运算符来做到这一点.我有这个代码:
struct vec4 {
float x;
float y;
float z;
float w;
...
inline float operator [] (int i)
{
switch (i) {
case 0:
return this->x;
case 1:
return this->y;
case 2:
return this->z;
case 3:
return this->w;
default:
exit(1);
return 0;
}
}
};
Run Code Online (Sandbox Code Playgroud)
我怎样才能改变这一点,以便我可以使用某些东西来达到效果
vec4 v;
...
v[2] = 5.0f;
Run Code Online (Sandbox Code Playgroud)
我听说过C++ 11中的rvalue引用,它们可能是一个潜在的解决方案吗?
编辑:我找到了一种方法来输入我的实际代码.
我已经读过下面的代码在C++ 11中有效:
int && a = 3;
a = 4;
Run Code Online (Sandbox Code Playgroud)
是否应该在存储数字文字3的内存地址中写入4?也许一些编译器优化可以防止这种情况发生,但它应该这样做吗?
在C/C++中命名"左值"和"右值"背后的原因是什么(我知道它们是如何运作的)?
我正在研究引用,我正在尝试一个程序将rvalue传递给函数作为引用参数,就像这样.
#include<iostream>
using namespace std;
int fun(int &x)
{
return x;
}
int main()
{
cout << fun(10);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,当我试图通过左值时,它起作用了.
#include<iostream>
using namespace std;
int fun(int &x)
{
return x;
}
int main()
{
int x=10;
cout << fun(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谁能解释我为什么会这样?
所以我有一个函数需要将std :: vector作为参数.我想知道声明参数的最佳方法,以便底层数组不会被深度复制,因为它可能相当大.
// which should I choose?
void myFunc(std::vector<char>); // 1
void myFunc(std::vector<char>&); // 2
void myFunc(std::vector<char>&&); // 3
void myFunc(std::vector<char>*) // 4
Run Code Online (Sandbox Code Playgroud)
我该选哪个?另外,我不会修改函数中的向量,所以不应该添加const?我应该重载该功能并将它们组合在一起吗?
我知道 const 引用会延长本地临时文件的寿命。现在我问自己是否可以在临时对象链上扩展此属性,也就是说,我是否可以安全地定义:
std::string const& foo = aBar.getTemporaryObject1().getTemporaryObject2();
Run Code Online (Sandbox Code Playgroud)
我的感觉是,由于第一个方法aBar.getTemporaryObject1()已经返回了一个临时对象,因此不适用于aBar.getTemporaryObject2().
我想知道用C语言计算什么更好:
if (x==0)
{
// Some code ...
}
Run Code Online (Sandbox Code Playgroud)
的
if (0==x)
{
// Some code ...
}
Run Code Online (Sandbox Code Playgroud)
我知道最后一个更好,以防程序员忘记第二个“=”并写“0 = x”而不是“0 == x”,因为编译器会抛出错误。
但我的问题是:
我认为这与“左值”和“右值”有关,并且我尝试在我的电脑中进行模拟,但没有任何重要的见解。