为什么继续使用const对象呢?
Why move on const objects work?
我有一个简单的代码:
const std::vector<int> data = {1,2,3};
std::vector<int> data_moved=std::move(data);
for(auto& i:data)
cout<<i;//output is 123
编译没有任何错误或警告!!
和似乎data
仍然有值在里面!
移动const值似乎不正确,因为我们不能修改const对象,那么代码是如何编译的?
你没有移动任何东西。
std::move
的名字真的很糟糕:它没有强制移动;它只是返回一个右值。由编译器决定调用std::vector<int>
的哪个构造函数,而决定您是否得到移动。
如果由于目标对象的move构造函数不匹配而无法移动容器,则根据基本的重载规则使用复制构造函数。
#include <iostream>
struct T
{
T() = default;
T(const T&) { std::cout << "copy ctorn"; }
T(T&&) { std::cout << "move ctorn"; }
};
int main()
{
T a;
T b = std::move(a); // "move ctor"
const T c;
T d = std::move(c); // "copy ctor" - `const T&&` only matches copy ctor
// (shut up GCC)
(void) b;
(void) d;
}
(现场演示)
它是这样设计的(const T&&
能够绑定到const T&
)至少部分是因为移动的目的是最好的努力,正是这样你不不得不与编译器错误作斗争,在这种情况下
相关文章:
- 被解释为低级别const的const对象的地址
- 使用共享指针的函数调用,其对象应为 const
- 如何从构造函数副本 T(const T&)调用对象 T?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- "this"指向的对象是否与 const 对象相同?
- const auto & 和 auto & if reference 对象之间的区别是 const
- 将对象传递给函数而不将其包装到 std::ref 中,而参数被指定为 const 引用
- C++ - 确定 const char* 是指向字符串文本对象还是动态对象
- 为什么 const YAML::Node 对象的行为不像 yaml-cpp 中的类似值的对象?
- 从 const 对象访问非 const 方法
- 将非 const 对象用于 const 参数
- 如何键入用于const对象的自定义io操纵器
- 对临时对象的Const引用不会延长其生存期
- 正在通过const-ref未定义的行为捕获新构造的对象
- 具有成员变量的对象 Const 数组 = 先前索引成员变量的总和
- 为什么我构建的临时对象const不可变
- 强制用户声明对象const