我有以下模板函数用于将任何标准类型的数据转储到二进制输出流中。templatestaticvoiddump(constT&v,ostream&o){o.write(reinterpret_cast(&v),sizeof(T));}除了reinterpret_cast,我还可以使用C风格(constchar*)。使用reinterpret_cast有什么特别的理由吗?我读了一些其他帖子,其中reinterpret_cast不受欢迎。但是上面的用法是合法的,不能用别的代替,对吧? 最佳答案 C风格转换的问题在于它们在幕后做了很多事情。有
我尝试用VS2013编译一些C++代码,unique_ptr::reset()似乎不适用于make_unique();一个小的可编译重现代码片段如下:#includeusingnamespacestd;intmain(){unique_ptrp=make_unique(3);p.reset(make_unique(10));}从命令行编译:C:\Temp\CppTests>cl/EHsc/W4/nologotest.cpp这些是来自MSVC编译器的错误:test.cpp(6):errorC2280:'voidstd::unique_ptr>::reset>>(_Ptr2)':attem
根据我的理解,mutable取消了变量的constnessClassA{voidfoo()const{m_a=5;}mutableintm_a;};还有const_cast:voidprint(char*str){cout(c));return0;}那么,是什么改变了彼此?谢谢 最佳答案 const_cast无法取消对象的常量性。const_cast只能从对象的访问路径中移除constness。访问路径是对对象的指针或引用。从访问路径中删除常量性对对象本身绝对没有影响。即使您使用const_cast移除访问路径的常量性,仍然不一定会
我的foo类包含一个std::auto_ptr成员,我想复制它的构造,但这似乎是不允许的。作业也有类似的事情。请参阅以下示例:structfoo{private:int_a;std::string_b;std::auto_ptr_c;public:foo(constfoo&rhs):_a(rhs._a),_b(rhs._b),_c(rhs._c)//error:Cannotmutaterhs._ctogiveupownership-D'Oh!{}foo&operator=(constfoo&rhs){_a=rhs._a;_b=rhs._b;_c=rhs._c;//error:Samep
如果我自己写,我想我会这样做:template>classUptr:privateDtor{T*vl_;public:explicitUptr(T*vl=nullptr)noexcept:vl_(vl){}~Uptr()noexcept{Dtor::operator()(vl_);}Uptr&swap(Uptr&o)noexcept{T*tmp;tmp=vl_;vl_=o.vl_;o.vl_=tmp;}Uptr&operator=(Uptr&&o)noexcept{o.swap(*this);}Uptr&operator=(nullptr_t)noexcept{vl_=nullptr;
以下代码在GCC(4.2-4.6)和Clang(2.1)下都能很好地编译,但是当我运行可执行文件时,它会显示“总线错误:10”。我不明白原因。#includestructA{staticintconstv;A(){++*const_cast(&A::v);}};intconstA::v=0;intmain(intargc,char*argv[]){Aa,b,c;std::cout 最佳答案 我认为相关的引用是:§7.1.6.1(4)fromN3242:Exceptthatanyclassmemberdeclaredmutableca
如何在GDB中访问std::tr1::shared_ptr的目标。这不起作用:(gdb)psharedPtr->variableOfTarget如果我尝试使用指针对象本身(psharedPtr),我会得到如下结果:$1=std::tr1::shared_ptr(count2)0x13c2060使用普通指针,我可以执行p*ptr并获取所有数据或仅获取一个变量的pptr->variable。我在Centos6.5、GCC4.4.7-4.el6和GDB7.2-64.el6_5.2上。 最佳答案 ptr->get()并不总是有效。当我尝试p
关于创建Stuff并赋予Foo所有权,以下是否是一种合理且有效的方法?classFoo{explicitFoo(conststd::shared_ptr&myStuff):m_myStuff(myStuff){}...private:conststd::shared_ptrm_myStuff;}std::shared_ptrfoosStuff(newStuff());Foof(foosStuff); 最佳答案 既然你对效率感兴趣,我想说明两点:shared_ptr是移动构造比复制构造成本更低的许多标准库类型之一。复制构造shared
事后看来,给定make_shared,shared_ptr是否会有一个采用原始指针的构造函数,如果它是在C++11中引入的?是否有支持此构造函数的有力论据或用例?它可以避免使用make_shared的exception-safety和memoryallocation/performanceadvantage的有据可查的陷阱。我相信通过make_shared要求构建shared_ptr的另一个好处是它可以是引擎盖下的单个指针,降低其内存使用并使诸如atomic_compare_exchange之类的东西成为更简单(并且可能更有效)。(见presentationfromC++Now)我知道
我最近正在为一个副项目(cpp-markdownlibrary,出于好奇)编写一段C++代码,遇到了一个编码问题,我想听听一些意见。cpp-markdown有一个名为Token的基类,它有许多子类。两个主要的子类是Container(包含其他Token的集合)和TextHolder(用作Token的基类当然是包含文本的)。大部分处理是通过虚函数处理的,但其中一些处理在单个函数中处理效果更好。为此,我最终使用dynamic_cast将指针从Token*向下转换为它的子类之一,这样我就可以调用特定于子类的函数,并且它的子类。转换不可能失败,因为代码能够通过虚函数(例如isUnmatch