在复制效率低下的情况下,移动语义替换复制语义.复制语义完全处理可复制对象,包括const对象.
在c ++ 11中已经存在无数的不可复制对象,例如std :: unique_ptr.这些对象完全依赖于移动语义,因为从对象移动允许使其无效.这对于像RAII这样的流行设计模式很重要(imho).
将const不可复制对象分配给内存区域时会出现问题.无法以任何方式恢复这样的对象.
这在对象的生命周期中显然很重要,因为它的常量.在它的生命周期结束时,当调用析构函数时,(不存在的)对象简单地是非常量的.
我建议移动析构函数可以成为移动语义模型的一个有价值的补充.
考虑一个简单的情况,其中unique_ptr用于unordered_set.您可以insert使用移动构造函数(或构造"emplace")进入此集合,但是如果您想将此指针移动到另一个unordered_set(即保持它为const),那么这将是不可能的.
必不可少的,有一个iterator insert((possibly const) key&&)但没有const key&& erase(iterator).事实上,这是不可能的.只能扩展容器以返回指向键的指针,并忘记它.
一个移动的析构函数可以解决这个问题const MyClass&& ~MyClass(),因为它只会在破坏期间违反const(当编译器认为对象无效时).
编辑:我应该指出const MyClass&& ~MyClass() const实际上更有意义.析构函数不必修改anyhting,只会破坏对象,就好像它不再是它控制的任何资源的有效句柄.
我目前正在尝试将std :: unique_ptr存储在std :: unordered_map中,但是我得到了一个奇怪的编译错误.相关代码:
#pragma once
#include "Entity.h"
#include <map>
#include <memory>
class EntityManager {
private:
typedef std::unique_ptr<Entity> EntityPtr;
typedef std::map<int, EntityPtr> EntityMap;
EntityMap map;
public:
/*
Adds an Entity
*/
void addEntity(EntityPtr);
/*
Removes an Entity by its ID
*/
void removeEntity(int id) {
map.erase(id);
}
Entity& getById(int id) {
return *map[id];
}
};
void EntityManager::addEntity(EntityPtr entity) {
if (!entity.get()) {
return;
}
map.insert(EntityMap::value_type(entity->getId(), std::move(entity)));
}
Run Code Online (Sandbox Code Playgroud)
这是编译错误:
c:\program files (x86)\microsoft visual studio 12.0\vc\include\tuple(438): error C2280: 'std::unique_ptr<Entity,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' …Run Code Online (Sandbox Code Playgroud) 在c ++ 11中,std :: unordered_set容器提供了insert重载和新函数emplace,因此它可以与非可复制构造的键一起使用,例如std :: unique_ptr.
当您想要删除其中一个键时会发生什么?是否auto temp = std::move(*some_iterator)有效?是否有一些功能允许我们擦除一个元素并同时将其移动到一个临时值?
编辑:我试图保持简短,甜蜜和简单,但要更清楚:
这种情况似乎是不可能的:您不能在删除密钥之前使密钥无效,并且在删除密钥后无法访问密钥.
我期望函数的这些定义使列表中的第二个元素相同
let myFunction (a:(b:_)) = b
Run Code Online (Sandbox Code Playgroud)
let myFunction [a,b,_] = b
Run Code Online (Sandbox Code Playgroud)
...但是第二个不适用于无限列表
Prelude> let myFunction [a,b,_] = b
Prelude> myFunction [1..]
*** Exception: <interactive>:8:5-26: Non-exhaustive patterns in function myFunction
Run Code Online (Sandbox Code Playgroud)
有什么不同?
编辑:也许[a,b,_]扩展到(a:(b:(_:[])))?
我正在尝试部署一个使用PersistentVolumeClaim和StorageClass动态配置所需的sotrage 的头盔图.这按预期工作,但我找不到任何允许工作流程的配置
helm delete xxx
# Make some changes and repackage chart
helm install --replace xxx
Run Code Online (Sandbox Code Playgroud)
我不想经常运行该版本,并且我希望将来在部署中重用存储.
设置存储类以reclaimPolicy: Retain保留磁盘,但是helm将删除PVC并孤立它们.注释PVC以便helm不会删除它们修复了这个问题,但是然后运行install会导致错误
Error: release xxx failed: persistentvolumeclaims "xxx-xxx-storage" already exists
Run Code Online (Sandbox Code Playgroud)
我想我误解了管理掌舵版本的一些基本知识.也许不应该在图表中创建卷.
对于以下输入,我无法完全理解球拍的REPL行为:
> 1 ;; Simple, 1 is self-evaluating
1
> '1 ;; (quote x) => x
1
> ''1 ;; ?? I expected '1
''1
> '''1 ;; ???
'''1
Run Code Online (Sandbox Code Playgroud)
我尝试编写一个简单的宏来测试:
#lang racket
(define-syntax e
(syntax-rules ()
((e x) (display (eval x )))))
Run Code Online (Sandbox Code Playgroud)
但它也给了我意想不到的输出:
> (e 1) ;;Self evaluating
1
> (e '1) ;;Evaluated '1 as 1
1
> (e ''1) ;;Shouldn't ''1 have been evaluated only once to '1?
1
> (e '''1)
'1
Run Code Online (Sandbox Code Playgroud)
那么racket的repl做了多少额外的步骤,为什么我的宏不像我预期的那样工作?
我创建了一个用户定义的数据类型并从文件中读取数据.以下是代码:
学生班:
package system.data;
public class Student {
private String firstName;
private String lastName;
private String regNumber;
private int coursework1Marks;
private int coursework2Marks;
private int finalExamMarks;
private double totalMarks;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getRegNumber() {
return regNumber;
}
public void setRegNumber(String regNumber) {
this.regNumber = regNumber;
}
public int getCoursework1Marks() …Run Code Online (Sandbox Code Playgroud)