草庐IT

move_function_imp

全部标签

c++ - 警告 : function uses 'auto' type specifier without trailing return type

下面的代码给出了下面的警告。有人可以解释原因吗(请注意代码没有用,因为我用int替换了我的类型来制作一个完整的示例)。警告:“MaxEventSize()”函数使用“auto”类型说明符而没有尾随返回类型[默认启用]想法是获取特定结构的最大大小(类型位于int所在的位置)。templateconstexprTcexMax(Ta,Tb){return(a 最佳答案 auto返回类型“没有尾随返回类型”是C++14的一个特性,所以我想你正在编译C++11。您的代码适用于C++14,但对于C++11,如果您想使用auto作为返回类型,您需

c++ - GCC 选项 : warning on non-void functions without a return statement

如果存在具有非空返回值但在其定义中不包含return语句的函数,是否有生成错误/警告的GCC/g++选项?例如:intadd(inta,intb){a+b;} 最佳答案 -Wreturn-type.它由-Wall(您应该始终与-Werror-Wextra一起运行)启用。 关于c++-GCC选项:warningonnon-voidfunctionswithoutareturnstatement,我们在StackOverflow上找到一个类似的问题: https:

c++ - 从 const 引用 move 构造

我有以下情况需要从t1move构造t2。不幸的是,这是不可能的(我想是违反常量的)从foo的调用者透明地处理该问题的正确方法是什么?(即不需要按值传递和显式std::move)structT{T()=default;~T()=default;T(T&&)=default;};Tfoo(constT&t){Tt3;if(predicate)returnt3;elsereturnstd::move(t);}intmain(){Tt1;Tt2=foo(t1);return0;} 最佳答案 Whatistherightapproachtoh

c++ - 比较 std::tr1::function<> 对象

我一直在尝试使用用于存储处理事件的函数的tr1函数模板在C++中实现类似C#的事件系统。我创建了一个vector,以便可以将多个监听器附加到此事件,即:vector>listenerList;我希望能够从列表中删除处理程序以停止监听器接收事件。那么,我如何才能在此列表中找到对应于给定监听器的条目?我可以测试列表中的“函数”对象是否引用特定函数吗?谢谢!编辑:在研究了boost::signal方法之后,它似乎可能像你们中的一些人所建议的那样使用token系统来实现。Here'ssomeinfoonthis.观察者在附加到事件时会保留一个“Connection”对象,并且此连接对象用于在需

c++ - std :move 的魔力是什么

以下代码使VC2010失败://code1std::string&test1(std::string&&x){returnx;}std::stringstr("xxx");test1(str);//#1Youcannotbindanlvaluetoanrvaluereference//code2std::string&&test1(std::string&&x){returnx;//#2Youcannotbindanlvaluetoanrvaluereference}有一些文章解释#1,但我不明白为什么#2也失败。让我们看看std::move是如何实现的templateinlinety

c++ - 在 map 中就地构建不可 move 的对象

我正在尝试在包含原子的映射中构造一个对象,因此它既不能复制也不能moveAFAICT。我的C++读物reference是mapemplace应该能够做到这一点。但是由于删除或不存在的构造函数,以下代码无法编译。使用make_pair没有帮助。#include#includeclassZ{std::atomici;};std::unordered_mapmap;voidtest(void){map.emplace(0,Z());//errormap[0]=Z();//error}这可能吗,如果不可能,为什么不呢?编辑:Linux上的编译器是gcc4.8.1 最

c++ - 类型转换和使用 std::move() 的区别?

我对刚刚添加到最新C++标准中的新函数std::move()有点好奇。看完一篇文章,发现函数的定义是namespacestd{templateinlinetypenameremove_reference::type&&move(T&&x){returnx;}}这似乎在调用std::move和使用转换之间没有任何区别。比如这里,classNPC{intm_number1;intm_number2;public:NPC():m_number1(1),m_number2(2){cout认为基本没有区别是对的吗?嗯,我非常确定我是对的,但也知道过于自信总是适得其反。提前致谢!

c++ - std::move(std::unique_ptr()) 组合是否有标准缩写?

我终于要将我的代码库迁移到C++11,这会产生更短更好的代码。但是我发现当我用一个新的指针调用函数时,它比以前长了很多:voidaddCallback(Callback*);//Takesownershipofcallback.//...addCallback(newCallback);//Clear.成为voidaddCallback(std::unique_ptr);//Nocommentneedednow!//...addCallback(std::move(std::unique_ptr(newCallback)));//bleh.提议的make_unique()模板函数只会在

c++ - 复制一个 std::function 有多昂贵?

虽然std::function是可移动的,但在某些情况下这是不可能的或不方便的。复制它会受到严重处罚吗?它是否可能取决于捕获变量的大小(如果它是使用lambda表达式创建的)?是否依赖于实现? 最佳答案 std::function通常实现为值语义、小缓冲区优化、虚拟调度、类型删除类。这意味着如果您的状态很小,则复制将不涉及堆分配(除了在状态的复制构造函数内)和一些间接(找到如何复制此特定状态)。如果您的状态很大(例如,在当前MSVC上大于两个std::string),则需要额外的堆分配来存储状态。这不是您想要在每帧每个像素的基础上执

c++ - 为什么我不能将 boost::function 存储在 std::list 中?

我得到以下编译错误:error:expected`;'before'it'"这是我的代码:#include#includetemplatevoidexample(){std::list>::iteratorit;}为什么会这样?我该如何解决? 最佳答案 您需要将typename放在该行的前面,因为您执行::iterator的类型取决于模板参数T。像这样:templatevoidexample(){typenamestd::list>::iteratorit;}考虑这条线std::list>::iterator*it;这可能意味着乘法