C++ 11 - 右值引用变量

标签 c++ c++11

有什么区别

int a = 42;

int&& rvr = 42;

a 显然是一个 lvalue,但是 rvr 也是一个 lvalue 因为它是一个命名变量,那么这些表达式是否可以被认为是完全等价的,如果不是,在哪些情况下首选 int&& 声明?

最佳答案

它们并不完全等价。你是对的,这两个变量都是左值,但是对于大多数类型,表单的初始化

T a = b;

创建一个临时 T 对象,然后从该临时对象构造 a。该临时对象可能会被省略,但它仍然需要适当的构造函数可用。

T &&a = b;

另一方面,将 a 直接绑定(bind)到 b,但要求 b 是一个右值。所以:

int a = 3;
// int&&b = a; // error: && cannot bind to lvalues
int b = a; // okay

struct S { S(const S &) = delete; };
S f();
// S s = f(); // error: no copy or move constructor available
S&&s = f(); // okay

更简单地说,decltype 也会给出不同的引用结果。

关于C++ 11 - 右值引用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27603035/

相关文章:

c++ - 在模块之间传递成员函数指针

c++ - 在另一个 cpp 文件中使用枚举时出现问题

c++ - C++ 中奇怪的多重赋值错误

c++ - 线程安全的 TBB::concurrent_hash_map 删除

c++ - 如何在 C++ 中的 vector 结构中使用结构 vector ?

c++ - 在 C MBED 中使用 strstr,打印结果

c++ - std::bind():以右值引用作为参数绑定(bind) lambda

c++ - 如何在运算符重载中将int类型的模板矩阵类静态转换为double类型?

c++ - 可以使用尾随返回类型进行条件重载吗?

c++ - 如果机器每个字节有 > 8 位,那么 int8_t 是什么?