我想要一个提供一些创建方法的运行时界面。这些方法返回unique_ptr,并且我想通过创建类启用自定义删除。问题是我绝对不希望接口(interface)直接提供这些方法——它们应该只在销毁unique_ptr时可用。.现在,我想我可以使用std::unique_ptr>,但我真的不想这样做,因为我根本不需要那种抽象级别,而且我不想支付堆分配费用。有什么建议吗? 最佳答案 我不太清楚您的规范,但您是否考虑过unique_ptr?这是一种非常灵活的类型,具有动态删除器的许多特性。如果这不是您想要的,您可以尝试以下方法:classimpl
我有一个auto_ptr,其中IFoo是一个只有纯虚拟方法的接口(interface)。我现在在段错误后还有一个核心文件,我真的很想知道这个auto_ptr背后的具体子类是什么。作为dynamic_cast在项目中工作,我认为RTTI必须以某种方式可用,但我不知道如何通过gdb访问此信息。?我得到的输出如下:(gdb)printthis->obj._M_ptr$22=(classmartin::IFoo*)0x7418我真正想知道的是,指针是否属于IBar或IBaz.感谢您的帮助! 最佳答案 WhatI'dreallyliketok
据我了解,unique_ptr表示专有所有权。单向链表似乎适合这种情况,每个节点都拥有下一个节点,例如(伪代码警报)classnode{public:unique_ptrnext;intvalue;};但我不明白如何执行像遍历列表这样的操作,我习惯这样做here=here->next;如何使用unique_ptr实现数据结构?它们是这项工作的正确工具吗? 最佳答案 当你遍历节点时,你不需要拥有节点指针,这意味着here=here->next;如果这里是unique_ptr则不正确。拥有一个对象意味着“对其生死负责”,这意味着所有者是
当使用auto&&处理返回左值的函数时:intfunc(){intv=42;returnv;}auto&&v=func();将v视为引用而不是左值会产生什么后果?这些后果是否证明使用decltype(auto)而不是auto&&来执行函数返回类型的通用处理是合理的? 最佳答案 auto&&已经是捕获函数返回值的最佳选择,因此decltype(auto)的差异只能是缺点。在您的示例中,生命周期延长应用于从函数返回的其他临时对象。这导致它的行为基本上与直接命名的对象相同,其效果是引用限定符被“删除”。将decltype(auto)与按值
下面的C++1y/C++14程序格式错误吗?templateconstexprautoX=42;intmain(){static_assert(X==42,"");}为什么/为什么不?Clangtrunk提示说:error:invalidoperandstobinaryexpression('auto'and'int') 最佳答案 这是clang中的一个错误,现在已修复:http://llvm.org/bugs/show_bug.cgi?id=19152 关于C++1y/14:autov
如果我在std::exception_ptr中存储了一个异常。我使用std::rethrow_exception重新抛出异常,使用catch(MyException&)访问它,然后修改值。如果我再次抛出相同的异常,我是否应该观察我所做的修改?下面的代码展示了我的想法:#include#includestructMyException{intvalue;};intmain(){std::exception_ptra=std::make_exception_ptr(MyException());try{std::rethrow_exception(a);}catch(MyException
我想我在VisualC++2015中遇到了一个错误,但我想确定一下。考虑这个片段:templatedecltype(auto)f(Tparam){returnparam+1;}intmain(){autoi=f(10);return0;}VisualC++2015在return语句中给出了这个警告:warningC4552:'+':operatorhasnoeffect;expectedoperatorwithside-effect尽管它似乎对生成的代码没有任何影响。这是编译器错误吗? 最佳答案 这似乎是一个错误。它在这里有一个开放
我一直在研究CompilerExplorer最近。我加载了其中一个采用指针参数的示例,并将其更改为采用unique_ptr参数。但我注意到在输出程序集中,明显没有对operatordelete的调用。我很好奇是否有人知道为什么。这是您可以粘贴到资源管理器中的示例。确保同时将-O3放入编译器选项中。#includeusingstd::unique_ptr;voidmaxArray(unique_ptrx,unique_ptry){for(inti=0;ix[i])x[i]=y[i];}}编辑:同样为了比较,如果我改为粘贴来自cppreference的代码示例之一,那么我会在输出中获取运算
我似乎无法弄清楚并尝试了以下建议:Move`unique_ptr`sbetweensetshowtomoveanstd::unique_ptrfromoneSTLcontainertoanother?我有两个包含唯一指针的集合:std::set>s1,s2;指针当然是唯一的,但some_type的值可能是也可能不是,所以在将s2连接到s1之后,s1的大小可能与|s1+s2|相同或一样大。看来我应该能够做到这一点:move(s2.begin(),s2.end(),inserter(s1,s1.end()));但这在clang++3.8/g++5.4中失败了。这里缺少什么?
C++std::shared_ptr可能是空,也可能是null。这两个概念都存在,而且它们不是等价的。此外,这些情况之间的任何一种暗示都不总是正确的。后一种情况检测起来很简单,因为operatorbool恰好提供了那个测试。根据文档,它“检查*this是否存储了一个非空指针,即是否get()!=nullptr。”是否有针对前一种情况的测试,即事物为空的情况?我对此的使用非常简单。我有一个具有静态工厂方法的类。静态工厂方法里面是一个静态本地shared_ptr到类的一个实例,初始化为nullptr.对该工厂方法的第一次调用构造该类的实例并初始化静态本地shared_ptr在返回它的拷贝之