C++11 移动语义后的对象状态
我想了解移动语义和右值引用以及函数调用后的对象状态 例如:我希望调用者填充列表并进入构造函数参数: typedef std::list<int> IntList; class IntHolder { public: explicit IntHolder(IntList&& l) : m_h(l) {} private: IntList m_h; }; IntList a; a.push_back(1); IntHolder holder(a);
我想了解移动语义和右值引用以及函数调用后的对象状态 例如:我希望调用者填充列表并进入构造函数参数: typedef std::list<int> IntList; class IntHolder { public: explicit IntHolder(IntList&& l) : m_h(l) {} private: IntList m_h; }; IntList a; a.push_back(1); IntHolder holder(a);
几天来,我一直在绞尽脑汁,想弄明白如何让一个类有一个干净的公共接口来执行回调机制的注册。回调可以是C++11 lambda、std::function、std::function、std::function,也可以是std::bind()的结果 该接口的关键在于,该类的用户只需要知道一个公共接口,该接口几乎接受用户可能抛出的任何函子/回调机制 显示函子和接口注册的简化类 结构类型1; 结构类型2;//可能与Type1的类型相同 类MyRegistrationClass { 公众: /** *清晰
大约两周前我开始学习cmake,我很喜欢它。到目前为止,我已经成功地为RHEL 6.x、Fedora 20+和Ubuntu12.04 LTS+构建和打包了(使用本机系统打包格式)libc++abi、libc++、llvm3.4,所有这些都使用了cmake(libc++abi以及我自己的cmake设置) < P> >我想创建一个C++构建环境, 使我们完全摆脱对GNU GCC和libstdc++的依赖(因此我们不希望上述发行版或下载站点提供任何LLVM RPM/DEB) 使我们能够全面探索C++1
我的问题是:以下观察到的行为是与C++11规范一致的,还是Microsoft对该语言的扩展 在一个测试程序(使用Visual Studio Express 2013)中,我正在测试从线程中运行的函数到父线程的异常传播。没有使用指定的异常指针,一切正常。。。这让我怀疑这是否真的是微软对该语言的扩展 所以我设置了“禁用语言扩展”,现在甚至没有Hello World编译器(C2400:内联汇编程序语法错误),所以我不知道观察到的行为是否与标准一致 阅读这里的其他一些问题给我的印象是,下面的方法不应该奏
我一直在想,使用mt19937_64(例如在boost或c++11中)比其32位变体有什么优势 谢谢。它有一个更大的种子,允许更多不同的伪随机序列。从本质上说,这意味着你可以把更多的随机性。它产生64位数字,所以一次可以得到更多的伪随机性。而且,它是使用64位操作实现的,因此它在64位机器上可能运行得更快,在32位机器上可能运行得更慢 两者都包含相同数量的总状态,64×312=19968位,因此序列在这个意义上是同样可预测的。如果您想要更多的状态,您可以使用std::mersenne_twist
更新:我在使用Visual Studio 2013的Windows上看到此“问题”。在Linux上使用Clang3.3和llvm标准库的最新版本时,我看不到同样的代码。尽管如此,我还没有准备好把它当作微软的bug 我注意到一个奇怪的问题,我正在处理一个无序的集合。我的负载系数为1,最大大小为数百万,但下面显示的最大桶数仅为8。我试过用不同的类型 有人能解释一下吗 这应该是系统或库实现限制,而不是依赖于初始化或配置的数字。我看过下面的代码示例,其中max_bucket_count与max_coun
假设我有一个类a,它提供了一个复制构造函数(接受另一个a) 然后我有一个a的派生类B,它不提供复制构造函数 我可以将A的复制构造函数继承到B中吗?对于非复制构造函数,可能是什么 注意:B没有任何状态,除了A中包含的状态。如果除了基类的复制构造函数提供的内容之外,您不需要任何特殊行为,只需告诉编译器使用默认的复制构造函数就可以了,它将调用基类的复制构造函数 #include <iostream> class A { public: int a; A()=default
我正在使用 std::chrono::duration_cast<std::chrono::milliseconds>( getTimestamp().time_since_epoch() ).count() std::chrono::duration\u cast( getTimestamp().time\u自\u epoch()起 ).count() 到具有毫秒精度的64位时间戳。这对于数据之间的某些序列化是必需的。稍后,我需要将这些时间戳转换回std::chrono::
我知道引入了override上下文关键字来编写更安全的代码(通过检查具有相同签名的virtual函数),但我对此感觉不太好,因为每当我想重写virtual函数时,编写override似乎是多余的 在99%的情况下不使用覆盖上下文关键字是否是一种不好的做法?为什么/何时必须使用它(当我们错误地隐藏虚拟函数时,编译器警告是不够的) 编辑:换句话说;在C++11中使用override上下文关键字的好处是什么?如果我们在C++03中错误地隐藏了一个虚拟函数(而没有使用override上下文关键字),我们
我目前正在实现某种层次结构,如果子实体附加到父实体,我需要将父实体指定给子实体。我的问题是,我是否可以在父类中使用friend方法解决这个问题,这是否是一种好的编码风格。下面是一个简短的例子来解释我的意思: class Node { Node* parent; Node() : parent(nullptr) { } friend void attachChild(const Node& child) const; friend void detachChil
在C++11中,emplace_back()通常比push_back()更受欢迎(在效率方面),因为它允许就地构造,但是在对已构造的对象使用push_back(std::move())时仍然是这样吗? 例如,emplace\u back()在以下情况下仍然首选吗 std::string mystring(“hello world”); std::vector myvector; myvector.emplace_back(mystring); myvector.push_back(std::mo
我对Linux和Clang比较陌生,我在使用Clang3.4工具链正确确定libstdc++库的位置时遇到了麻烦。我正在运行Mint17,安装了Clang-3.4和GCC4.8。 使用verbose标志,输出如下所示: #include "..." search starts here: #include <...> search starts here: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++
这在VS2013更新4中仍然是一个问题吗 我定义了这个宏: #define STR LR"(c:\program files)" 但是,在下面编译时 cout<< STR 可能不是问这个问题的合适地方。没有任何东西表明它在宏中工作:有趣的是,原始和宽原始文本都在宏之外工作,原始文本在宏中工作,但宽原始文本不工作。看起来像只虫子。可能尝试在connect.microsoft.com上提交一个bug:刚刚检查了VS2015预览版-该问题是可复制的。另外,在预处理之后,有一个相关的问题
您不能在内部循环中将new\u it分配给it。这样做: for(it = new_it->begin(); it!=new_it->end(); ++it) 问题是在您的循环中,它应该是(it = NexJit ->开始);it=NexSIT->端();(++it)< /代码>。并且,当您将该集合插入另一个时,考虑使用 STD::移动< /代码>。您当前的实现有点困难inefficient@PiotrS.字体你比我快。如果你回答,我会删除我的。@Beta没问题,我不打算发布答案。
我只是想确保没有人从我的非多态类派生,所以我使用了以下语法: class Foo final { Foo(); ~Foo(); // not virtual void bar(); }; 在C++编程语言中,我读到代码>最终< /COD>可以与包含虚拟成员函数的类一起使用覆盖> /COD>。我在VS2013中尝试了我的代码示例,它编译时没有任何警告 是否允许对非多态类使用关键字final,以防止从类派生?关键字override对非多态类有意义吗?是的,即使您的类不是虚
我通过macport安装了g++4.8。我可以通过调用g++-mp-4.8来使用它 我用G++ 4.8编译了这个代码,看看我是否得到C++ 11,但是答案是预先标准的C++。怎么可能呢?注意:我希望C++11可以使用自动迭代器 if( __cplusplus == 201103L ) std::cout << "C++11\n" ; else if( __cplusplus == 19971L ) std::cout << "C++98\n" ; else std::co
问题的要点是,我有一个主函数,它初始化SDL,为上下文创建设置OpenGL属性,创建一个上下文,创建一个表示OpenGL渲染上下文的类,同时包含窗口和上下文,报告OpenGL版本的一些信息和其他基本信息,并进入用户关闭窗口或按ESC键时退出的常规循环 除了我无法测试其中任何一个之外,因为从未输入main,SDL_main.h似乎包含一个用SDL_main替换main的定义,并且实际的main是从静态库调用的。出于某种原因,它以返回值0退出,而从未进入实际的main。奇怪的是,除了添加Render
所以我在一个部分中定义了一些枚举,我需要在程序的多个其他部分中使用它。我想,在C++11中没有外部枚举。那么,如何在不同的单元中使用相同的已定义枚举?抱歉重复或误解。这似乎正是头文件的用途: 枚举定义H: enum class my_enum_type { /* .... */ }; 文件1.C: #include <enum_def.H> #包括 文件2.C: #include <enum_def.H> #包括 这似乎正是头文件的用途: 枚举定义H: e
对我来说,这看起来不错,但编译器会抱怨。所以上面的代码足够简单。作为参考,folly是一种可以查找的开放源代码,它位于以下位置: 核心问题是gcc声称“std::string”含糊不清 然而这听起来很疯狂,对吧。。。代码对std::string进行了正向声明,但是双abi 98/11 libstdc++通过内联名称空间将std::string转换为std:u cx11::string。因此,在“非内联命名空间从用户空间向前声明”之后,gcc开始将std::string视为模棱两可。很明显,这是
我想在std::vector中存储三个任意整数,而不定义结构/类。所以我选择了std::tuple: std::vectorc:\ProgramFiles(x86)\microsoft visual studio 12.0\vc\include\vector(1628):错误C2036:'std::tuple*':未知大小 1> c:\ProgramFiles(x86)\microsoft visual studio 12.0\vc\include\vector(1622):编译类模板成员函数“
我想对缓存中的一些静态函数使用常量缓存的性能进行基准测试。所以我有这样的想法: class Foo { static double cost(int factor) { <moderately complex function> }; // Other stuff using the cost() function }; 我想以另一个版本为基准,比如: class Foo { private: static double _cost(i
这是SPOJ“SEGSQRSS-带分段树的平方和”的问题。问题的链接是我试图使用延迟传播来实现这一点,但找不到正确的解决方案,有人能帮助我解决问题吗 #include <map> #include <set> #include <math.h> #include <string> #include <vector> #include <stdio.h> #include <iostream> #include &
这就是我的代码的样子 #include <iostream> #include <set> using namespace std; enum Enum_type { Enum_type_1 = 1, Enum_type_2, Enum_type_3, Enum_type_4 }; class my_class { public: my_class(Enum_type type) : source_type(
我有一个程序,需要生成非常多的0/1随机值。因为在代码的不同部分需要多次执行此任务,所以我希望有一个时间效率高且易于使用的随机生成器来执行此任务 我从C++11开始使用标准库,但文档非常稀少,有时甚至相互矛盾 我的问题如下: 我应该自己提取位(对无符号long使用掩码)还是库可以自己提取位 事实上,我发现了一种说法: 更好的是,符合标准的分布可以处理所有引擎 角落案件,甚至不太可能的案件。例如,如果发动机提供 每次呼叫的比特数少于需要的比特数,分发将产生多个 调用,直到它有足够的位来满足整个
我试图学习尾随返回类型的概念,以及使用标记分派在成员函数重载中使用它的可能性。我编写的玩具实现如下所示: #include <string> #include <iostream> using namespace std; // Tags namespace Params { struct t_param1{}; struct t_param2{}; };
我刚开始使用并尝试编译代码示例,尤其是alhrtf.c文件,使用terminal命令如下: g++ alhrtf.c -o hrtf -lalut -lal -lalc -lopenal -std=c++11 我收到了一堆错误消息,如: alhrtf.c:161:28:错误:“ALC_NUM_HRTF_SPECIFIERS_SOFT”未在此范围内声明 似乎我需要链接“hrtf”库 所以我的问题是,我必须设置什么编译器标志 我将非常感谢你的帮助 参考资料: 链接到脚本位置: 我在Ubuntu
我学到了: 用户定义的后缀增量运算符应返回一个常量对象,使其行为类似于基本算术类型: int i = 0; i++ = 42; // error, i++ is pr-value ++i = 42; // ok, ++i is l-value 所以对于类Widget,它应该声明为 const Widget operator++(int); ... Widget w1, w2; w1++ = w2; // error, fine, same as i++ = 42 如果没有const,它将编译
对于我正在从事的项目,性能是非常重要的。看看我做的以下实验 int main(int argc, char * argv[]) { size_t v_size = 10000000; // vector size vector<char> v(v_size); vector<char> buff(v_size); string cmd = argv[1]; size_t n = std::stoll(argv[2]);
我一直在cplusplus论坛和stackoverflow上四处寻找,但我没有找到答案。我所找到的只是Windows的东西或是为他们工作的IDE人员 我用C++和GTKMM创建了一个应用程序,没有别的,我只有一个TeTeTebug和一个编译器,我用我的终端来控制(我在很多人都在谈论UNIDs和东西),这是基于UNIX的计算机。p> 当我运行我的应用程序(./application)时,我总是看到我的终端和gui应用程序,我想隐藏终端。我将如何实现这一点 感谢上一篇:)所以我发现它不同于操作系统。
除非对clear()向量行进行注释,否则下一个源代码甚至不会编译。有人能告诉我为什么以及如何修复它吗 #include <vector> class Class { public: typedef std::unique_ptr<int> Variable; public: Class() {} Class(Class&& other) { variables = std::move(other.variables); } p
我知道如何使用时间的时钟函数生成随机数。h,有没有其他方法不使用系统时钟来生成随机数这是计算中的一个难题,因为计算机基本上是确定性机器,没有外部熵源就无法生成随机数。将伪随机数生成器植入当前系统时间足以模拟“真实随机性”,用于多种目的 如果您希望避免将种子设定到当前系统时间,并且仍然从PRNG生成唯一的数字,那么以下是一些选项(请注意,我假设您所说的不是预期的PRNG,它还有许多其他要求): 如果计算机已启用,则获取堆栈指针寄存器的当前值 当前存储设备上可用的字节数或当前用户的剩余磁盘配额 最近
我不知道下面的示例输出是如何产生的,有人能告诉我吗?提前谢谢 #include <iostream> #include <algorithm> class A { public: // Simple constructor that initializes the resource. explicit A(size_t length) : mLength(length), mData(new int[length]) {
历史上,我一直使用trait类来保存信息,并将其应用到运行相同“算法”的“泛型”函数中。只是trait类不同。例如: enum选择器{SELECTOR1,SELECTOR2,SELECTOR3,}; //声明 模板struct-example\u-trait; 模板结构示例_trait{ 静态constexpr size\u t member\u var=3; 静态大小\u t do\u something(){return 0;} }; 模板结构示例_trait{ 静态constexpr si
在构建用于在嵌入式微处理器上控制硬件的库时,一项常见任务是操纵特定内存位置的位以控制硬件功能 在AVR处理器中,Atmel(现在的Microchip)提供了可扩展为以下内容的宏: 这可以实现以下功能: 现在在C++11(及更新版本)中,希望用constepr替换几乎所有#define的用法 在GCC C++编译器的旧版本中(4.9),以下编译: #include <avr/io.h> constexpr volatile uint8_t *const PortA = &P
我应该按字母顺序排列员工的全名。基本上,我的问题是如何在不使用指针的情况下按字母顺序对struct中的字符串进行排序 这是我代码的链接。我已经完成了大部分程序,除了按字母顺序对struct中的最后一段字符串进行排序 下面是一个使用算法::排序的示例 #include <algorithm> #include <iostream> struct Employee{ std::string s; static bool comp(const Employee&
我想确定如何使用boost::aio::async_连接lambda。 Boost版本1.68 真奇怪,我可以使用std::bind,但不能使用lambda。 如果我使用std::bind,它就会工作。 但是,当我使用lambda时,它构建失败,并表示未满足IteratorConnectionHandler类型要求 绑定版本工作正常 void SslClient::connect(boost::asio::ip::tcp::resolver::results_type results) {
有了两个模板参数,第二个是默认的,当专业化结果显式地将默认类型提供给第二个参数时,我得到了我所期望的结果。在这种情况下,专业化是形成良好的,因为它更专业,它得到选择 当我重复这一点时,仅使用一个模板参数(也是默认的),专业化似乎仍然是格式良好的,显式地提供了基础模板中默认的类型。然而,在这种情况下,这似乎被忽视,而不是被认为更专业。始终选择基本版本 有人能解释一下为什么会这样吗 #include <iostream> #include <utility> #include
我希望能够在编译时指定一个整数列表 这些整数用于输出系统中某些组件的调试信息,这些组件将这些整数作为id。打印调试信息的实际实现在我们自己的一个库中,但我需要能够指定要从使用该库的项目中调试的id,例如 -DDEBUG\u SENSORIDS=“12,23,45” 在实际C++代码中,定义(当存在时)需要转换成整数数组或向量。 以下解决方案会导致编译错误 int-debugIds[]={DEBUG_-SENSORIDS} <command-line>:0:31: error: exp
以下lambda表达式代码无法在VC++2010中编译 void error_check() {} int main() { vector<int> v(10); std::generate(v.begin(), v.end(), [](){ //either add -> int, error_check(); //or comment this out to compile return rand()%99; }); }
所以,我有一个使用boost::asio的应用程序。由于项目的复杂性,我无法分享它的源代码,很遗憾:( 应用程序使用boost的asio库来创建一些Web服务。但是,当尝试使用它时,std::type_info::operator==中有一个sigsegv,我知道,它应该可以工作 (gdb) backtrace #0 0x0000000000457b79 in std::type_info::operator== ( this=0x7ffff6dadf61 <typeinfo for b
首先,没有“接口”这样的内置概念。通过C++中的接口,我的意思是一些抽象基类,看起来像: struct ITreeNode { ... // some pure virtual functions }; 然后我们可以使用具体的结构来实现接口,例如: struct BinaryTreeNode : public ITreeNode { BinaryTreeNode* LeftChild; BinaryTreeNode* RightChild; // plus the over
我目前的理解是,C++11移动和复制赋值操作符都应该调用delete以防止内存泄漏,但C++11移动和复制构造函数应该而不是 如果我的理解是正确的,构造函数不需要调用delete,但是我不确定为什么。考虑下面的例子: class my_class { my_class(int num_data) : my_data{new double[num_data]}, my_data_length{num_data} { } // This class manages
我试图使用这里的建议:检查互斥锁当前是否已锁定。乍一看它似乎可以工作,但当您尝试从多个线程使用它时,它崩溃了。我的猜测是,unique_lock不是线程安全的,这很有意义,这意味着在不编写包装器的情况下,无法轻松检查互斥锁是否已锁定 #include <iostream> #include <thread> #include <mutex> long glob=0; std::mutex mutex_; std::unique_lock <std::
在C++11中,构造函数、析构函数和复制/移动操作符的默认实现可以用“=default”指定。在头文件、类定义所在的位置或源文件(cpp)中,将“=default”放在何处 在头文件Test.h中: class Test { public: ~Test() = default; }; 在源文件Test.cpp中: class Test { public: ~Test(); }; #include "Test.h" Test::~Test() = default; 您必须将其
在这段代码中,字符长度突然改变。在引入char文件之前,strlen(str)是正确的。当我引入新的char文件时,变量str的strlen值发生了变化 #include <unistd.h> #include <iostream> #include <stdio.h> #include <string.h> using namespace std; int main(){ char buf[BUFSIZ]; if(!get
在for函数中,如何从2到2进行编号。我的意思是for(I=1;I必须在for循环中使用额外的变量 看这里 int sum = 1, addValue= 0; for (int i = 0; i < n; ++n. addValue += 2) sum += addValue; return sum; int sum=1,addValue=0; 对于(int i=0;i
矩阵1: 0x02 0x03 0x01 0x01 0x01 0x02 0x03 0x01 0x01 0x01 0x02 0x03 0x03 0x01 0x01 0x02 矩阵2: 0x63 0x53 0xe0 0x8c 0x09 0x60 0xe1 0x04 0xcd 0x70 0xb7 0x51 0xba 0xca 0xd0 0xe7 这两个矩阵在此函数中相乘: void mul(uint8_t state[4][4]) { for(unsigned short i = 0; i &l
尝试从字符向量复制到字符串向量在解决方案中多次尝试都失败 在复制之前将内存分配给向量可以使std::copy在置于“OutputIterator result”(基于函数模板)时正常工作。我试图: std::copy(char1.begin(),char1.end(),v1.begin()) 然而,这也是不成功的。使用back_inserter返回错误c2679“binary'=”:未找到接受“char”类型的右操作数的运算符(或者没有可接受的转换) 输入文件位于此处: #包括 #包括 #包括
所以我有一个类,其中有一个共享的ptr,声明如下 std :: shared_ptr< T > dyn_arr{ new T[ dyn_arr_max_size ], std :: default_delete< T[] >() }; std::shared_ptrdyn_arr{newt[dyn_arr_max_size],std::default_delete(); 这指向某个大小的动态数组。 我还为它实现了一个迭代器。在这个迭代器中有一个++重载运算符。现在当我
(*it.first和it->first之间有什么区别 它们是否可以互换使用,例如在下面的代码中? 此外,如果有人有一个好的资源,我可以学习迭代器,这将非常有帮助。特别是关于这行vector::iterator有人能解释一下吗? vector<pair<int, int>> adj[10005]; //For storing vertices, weights of a directed graph as an adjacency list for(int i = 1;