草庐IT

btn-move-forward

全部标签

c++ - 为什么我们需要第二个 std::forward 特化?

据我对std::forward工作原理的解释了解http://thbecker.net/articles/rvalue_references/section_08.html我们可以只使用一个版本的std::forward:templateS&&forward(typenameremove_reference::type&a)noexcept但实际上,我们有(http://en.cppreference.com/w/cpp/utility/forward)第二个版本:templateT&&forward(typenamestd::remove_reference::type&&t);与前

c++ - 如何追踪 LLVM verifyFunction 错误 "Expected no forward declarations!"?

我正在LLVM中为我的一种新语言开发编译器,但在生成调试信息时遇到了问题。我还没有找到很多关于如何使用DIBuilder实际生成调试信息的文档。所以我很可能做错了很多事。我一直在看Kaleidoscope示例,因为它是我发现的唯一一个使用调试信息的示例。我还没有打开Clang来查看他们是如何使用它的,但我很想听听已经使用过的人的意见。我已经能够使用一些更复杂的示例来编译和运行我的语言,但是我从一些基础知识开始重新添加调试支持。这是我要编译的简单脚本:doublemy_main(){return0.0;}这是我从verifyFunction、verifyModule和转储模块的输出。编辑

c++ - 当参数被转发时,std::move 在参数列表中是否安全,而不是 move 构造?

试图为std::string_viewandstd::stringinstd::unordered_set提供解决方案,我正在尝试替换std::unordered_set与std::unordered_map>(该值为std::unique_ptr,因为小字符串优化意味着string的基础数据的地址不会始终作为std::move的结果传输)。我的原始测试代码似乎有效,是(省略标题):usingnamespacestd::literals;intmain(intargc,char**argv){std::unordered_map>mymap;for(inti=1;i(argv[i]);

c++ - vector 、 move 语义、nothrow 和 g++ 4.7

我编写了以下代码来理解move语义。它在g++-4.6中按预期工作(即没有复制,只move),但在g++-4.7.0中没有。我认为这是g++-4.7.0中链接的错误,但这个link说这不是g++-4.7中的错误。因此,正如我从上面的链接中理解的那样,我使move构造函数不抛出,但它仍然只执行复制。但是,如果我不抛出复制构造函数,则只会发生move。谁能解释一下?#include#includeusingnamespacestd;structS{intv;staticintccount,mcount;S(){}//nothrowconstructor//S(nothrow)(constS

c++ - 从 unordered_map move 键

我已经搜索过,但我只发现了关于使用映射值move构造函数的问题,但我想尝试一些不同的东西。是否可以使用std::move来自std::unordered_map的key?原因很简单:我想构建一个示例,在该示例中我从map创建一个vector,尽可能少地浪费内存。我知道这会弄乱map的表示,但是嘿,毕竟我再也不会使用map了,所以移出值是有意义的。我的猜测是:不,我不能那样做。不过,我想确认一下。这是一个简单的代码。我希望看到move构造函数被调用,但我调用了复制构造函数。干杯,谢谢!#include#include#include#include#includeclassprop{pu

c++ - 在构造函数初始化列表上 move shared_ptr

最近我看到了几个这样的代码示例,其中std::move用于构造函数初始化列表(而不是move构造函数)。classA{public:A(std::shared_ptrres):myRes(std::move(res)){//...}private:std::shared_ptrmyRes;}我得到的信息是这个结构是出于优化原因而设计的。我个人尽可能少用std::move。我威胁他们作为Actor(正如斯科特迈耶斯所说),并且只在调用者代码中(唯一的异常(exception)是move构造函数)。对我来说,这看起来像是某种混淆或微优化,但也许我错了。如果没有std::move,编译器不会

c++ - 如何 std::forward( *this )

因为我想重载一个成员函数的所有cv和引用限定,我自己写了下面的宏:#defineDEFINE_FUNCTION(sig,functionality)\sig&{functionality;}\sig&&{functionality;}\sigconst&{functionality;}\sigconst&&{functionality;}\sigvolatile&{functionality;}\sigvolatile&&{functionality;}\sigconstvolatile&{functionality;}\sigconstvolatile&&{functionality

C++ 为什么在我的类中添加析构函数会使我的类无法 move ?

编译器提醒我正在使用已删除的函数。https://ideone.com/3YAIlA#includeusingnamespacestd;classfoo{public:unique_ptrp;~foo(){}};intmain(){fooa,b;a=move(b);return0;}编译信息prog.cpp:Infunction'intmain()':prog.cpp:15:4:error:useofdeletedfunction'foo&foo::operator=(constfoo&)'a=move(b);prog.cpp:3:7:note:'foo&foo::operator=(

c++ - C++ 中 move 语义的起源是什么?

我想知道movesemantics的来源是什么在C++中?特别是它是专门为这种语言发明的还是其他语言中有类似的东西?在后一种情况下,您能否提供一些引用。 最佳答案 这个概念似乎没有任何特定的祖先。C++move语义的起源,如theoriginalproposal中所述,是新闻组中的讨论:MovesemanticsinvariousformshasbeendiscussedinC++forums(mostnotablycomp.lang.c++.moderated)foryears.在我看来,它们与C++的左值和右值概念紧密相关,如果

c++ - RVO, move 语义和优化代码的斗争

如果我没看错的话,move语义允许从临时的、未命名的对象中move和重用资源。RVO,尽管之前的move语义更进一步,并“窃取”了整个对象以避免额外的构造函数调用和赋值/复制函数。这对我来说似乎有点违反直觉,如果被调用的构造函数直接使用最终左值目标的地址直接将数据放置在用户需要的位置,不是会更快、更简单且用户显而易见吗?我的意思是,“在这个位置创建这个对象”似乎比“在某个地方创建这个对象,然后将它复制到正确的位置”更直观一些。 最佳答案 是的,它“有点违反直觉”。启用复制省略后,构造函数的所有副作用也将被省略。#includestr