相关疑难解决方法(0)

表达式和变量的C++类型和值类别

从这个链接,它说

对象,引用,函数(包括函数模板特化)和表达式都有一个名为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)?

编辑:这里的评论让我想知道这个问题.

c++

9
推荐指数
2
解决办法
589
查看次数

移动未调用的构造函数

在尝试编写有关移动构造函数的示例后,我遇到了以下代码:

#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

c++ move copy-constructor move-semantics c++11

7
推荐指数
1
解决办法
1357
查看次数

C++ - 将右值引用传递给函数?

我无法理解右值引用的工作原理。我有以下代码:

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)

c++

4
推荐指数
1
解决办法
185
查看次数

标签 统计

c++ ×3

c++11 ×1

copy-constructor ×1

move ×1

move-semantics ×1