草庐IT

move-semantics

全部标签

C++17 表达式求值顺序和 std::move

今天在重构一些代码以更改指向std::unique_ptr的原始指针时,我遇到了由于orderofevaluation导致的段错误错误。旧代码做了如下的事情:voidadd(conststd::string&name,Foo*f){_foo_map[name]=f;}voidprocess(Foo*f){add(f->name,f);}第一次天真地重构代码以使用std::unique_ptr:voidadd(conststd::string&name,std::unique_ptrf){_foo_map[name]=std::move(f);}voidprocess(std::uniq

c++ - move 由逗号运算符抑制的构造函数

这个程序:#includestructT{T(){}T(constT&){std::coutT{returnt;})({});std::coutT{returnvoid(),t;})({});std::coutT{returnvoid(),std::move(t);})({});std::cout当由gcc-4.7.1编译时输出(link):moveconstructorcopyconstructormoveconstructor为什么逗号操作符会有这种效果?标准说:5.18Commaoperator[expr.comma]1-[...]Thetypeandvalueoftheresu

c++ - move 由逗号运算符抑制的构造函数

这个程序:#includestructT{T(){}T(constT&){std::coutT{returnt;})({});std::coutT{returnvoid(),t;})({});std::coutT{returnvoid(),std::move(t);})({});std::cout当由gcc-4.7.1编译时输出(link):moveconstructorcopyconstructormoveconstructor为什么逗号操作符会有这种效果?标准说:5.18Commaoperator[expr.comma]1-[...]Thetypeandvalueoftheresu

docker镜像tag,版本号规则,语义化版本号(Semantic Versioning)

文章目录docker镜像tag定义规则语义化版本号(SemanticVersioning)Gitcommit哈希值示例docker镜像tag定义规则Docker的tag是用于标识Docker镜像版本的一个字符串,通常格式为:。其中指的是镜像的名称,则是镜像的版本号。在定义Docker镜像的tag时,建议使用语义化版本号(SemanticVersioning),即..格式,例如1.2.3。这样可以清晰地表示镜像版本的重要性和更新程度,方便用户进行版本控制和管理。此外,也可以在tag中加入其他的信息,例如构建日期、Gitcommit哈希值等,以便于更好地追踪镜像的变更历史和来源。例如,可以使用如下

c++ - 这里需要 `std::move` 吗?

是std::move以下代码段中是否需要?std::functionmy_std_function;voidcall(std::function&&other_function){my_std_function.swap(std::move(other_function));}据我所知call()接受右值引用..但由于右值引用本身就是一个左值,为了调用swap(std::function&&)我必须使用std::move将其重新转换为右值引用我的推理是正确的还是std::move在这种情况下可以省略(如果可以,为什么?) 最佳答案

c++ - 这里需要 `std::move` 吗?

是std::move以下代码段中是否需要?std::functionmy_std_function;voidcall(std::function&&other_function){my_std_function.swap(std::move(other_function));}据我所知call()接受右值引用..但由于右值引用本身就是一个左值,为了调用swap(std::function&&)我必须使用std::move将其重新转换为右值引用我的推理是正确的还是std::move在这种情况下可以省略(如果可以,为什么?) 最佳答案

c++ - std::move 已经是 T&& 的变量

在页面Howto:WriteaMoveConstructorMicrosoft有一个关于如何编写移动构造函数的示例。它本质上是这样的:MyClass::MyClass(MyClass&&lhs){*this=std::move(lhs);}我已经尝试过了,这里确实需要std::move,但为什么呢?我认为move所做的唯一一件事就是转换为T&&。但是lhs已经是MyClass&&类型了,不是吗? 最佳答案 Namedrvaluereferencesarelvalues.Unnamedrvaluereferencesarervalue

c++ - std::move 已经是 T&& 的变量

在页面Howto:WriteaMoveConstructorMicrosoft有一个关于如何编写移动构造函数的示例。它本质上是这样的:MyClass::MyClass(MyClass&&lhs){*this=std::move(lhs);}我已经尝试过了,这里确实需要std::move,但为什么呢?我认为move所做的唯一一件事就是转换为T&&。但是lhs已经是MyClass&&类型了,不是吗? 最佳答案 Namedrvaluereferencesarelvalues.Unnamedrvaluereferencesarervalue

c++ - 了解 `std::is_move_constructible`

没有移动构造函数但具有接受constT&参数的复制构造函数的类型,满足std::is_move_constructible。例如,在以下代码中:#includestructT{T(constT&){}//T(T&&)=delete;};intmain(){static_assert(std::is_move_constructible::value,"notmoveconstructible");return0;}T将没有隐式移动构造函数,因为它有一个用户定义的复制构造函数。但是,如果我们取消注释移动构造函数的显式删除,代码将不再编译。为什么是这样?我本来希望显式复制构造函数仍然满足s

c++ - 了解 `std::is_move_constructible`

没有移动构造函数但具有接受constT&参数的复制构造函数的类型,满足std::is_move_constructible。例如,在以下代码中:#includestructT{T(constT&){}//T(T&&)=delete;};intmain(){static_assert(std::is_move_constructible::value,"notmoveconstructible");return0;}T将没有隐式移动构造函数,因为它有一个用户定义的复制构造函数。但是,如果我们取消注释移动构造函数的显式删除,代码将不再编译。为什么是这样?我本来希望显式复制构造函数仍然满足s