草庐IT

non-unique

全部标签

c++ - 何时以及为何会生成 std​​::__non_rtti_object 异常?

我正在使用VisualStudio并执行有效的动态转换。启用RTTI。编辑:更新代码使其更真实structbase{virtualbase*Clone(){base*ptr=newbase;CopyValuesTo(ptr);returnptr;}virtualvoidCopyValuesTo(base*ptr){...}virtual~base(){}}structderived:publicbase{virtualbase*Clone(){derived*ptr=newderived;CopyValuesTo(ptr);returnptr;}virtualvoidCopyValue

c++ - 由 const std::unique_ptr 管理的对象的生命周期

我在std::unique_ptrreference中看到以下注释:Onlynon-constunique_ptrcantransfertheownershipofthemanagedobjecttoanotherunique_ptr.Thelifetimeofanobjectmanagedbyconststd::unique_ptrislimitedtothescopeinwhichthepointerwascreated.有谁能举例说明一下吗?我不明白为什么。 最佳答案 您根本无法从conststd::unique_ptr移动,

c++ - 为什么我们不能将 "="用于 shared_ptr 或 unique_ptr?

这个问题在这里已经有了答案:Whydoesn'tshared_ptrpermitdirectassignment(5个答案)关闭5年前。我发现语法有编译错误。std::shared_ptrp=newint(5);3141E:\temprory(deleteitifulike)\1208.cpp[Error]conversionfrom'int*'tonon-scalartype'std::shared_ptr'requested不过没关系std::shared_ptrp(newint(5));与unique_ptr相同;但不知道为什么要禁止。

c++ - 哪个更好 : a lying copy constructor or a non-standard one?

我有一个包含不可复制句柄的C++类。但是,该类必须有一个复制构造函数。因此,我实现了一个将句柄的所有权转移到新对象的方法(如下所示),classFoo{public:Foo():h_(INVALID_HANDLE_VALUE){};//transferthehandletothenewinstanceFoo(constFoo&other):h_(other.Detach()){};~Foo(){if(INVALID_HANDLE_VALUE!=h_)CloseHandle(h_);};//otherinterestingfunctions...private:///disallowas

c++ - 为什么我不能用 reset() 删除 unique_ptr<char[]>?

当我有一个指向单个对象的唯一指针时,我可以用reset()删除它:std::unique_ptrvariable(newchar);variable.reset();但是,这不适用于std::unique_ptr包含一个数组。为什么?删除此类指针的正确方法是什么?我正在使用EmbarcaderoC++Builder10.1。相关标准是C++11。我的观察当我有一个包含数组的唯一指针时,编译失败:std::unique_ptrvariable(newchar[10]);variable.reset();错误信息是nomatchingfunctiontocallfor'reset'.这也失

c++ - `unique_lock`、 `scoped_lock` 和 `lock_guard` 中指定的 mutex_type 的用例是什么?

用于保护std::mutex的c++11mutexRAII类型都有一个typedef:typedefMutexmutex_type;std::lock_guard::mutex_typestd::unique_lock::mutex_typestd::scoped_lock::mutex_type这个成员typedef有什么意义?起初我认为它可以用来概括创建一个对象来移动锁(在unique_lock的情况下)例如:templatevoidfunction(SomeLockin)SomeLock::mutex_typenewMutex;//Dosomething但我无法想象它的用途。需要

c++ - 为什么 VS 和 gcc 在这里调用不同的转换运算符(const vs non-const)?

这段代码当然很蠢,但我写它只是为了说明问题。在这里:#includeusingnamespacestd;structfoo{inta=42;templateoperatorT*(){cout(&a);}templateoperatorconstT*()const{cout(&a);}templateTget(){coutoperatorT();}};intmain(){foomyFoo;cout()使用VisualStudio2019(ISOC++17,/Ox)编译时的输出是:Tget()operatorconstT*()const42gcc8.3(-std=c++17,-O3)的输出

c++ - 线程安全的 unique_ptr move

是否可以使用C++11原子操作安全地moveunique_ptr?目前我有这样的代码std::unique_ptrDataManager::borrowSyncToken(){std::unique_locksyncTokenLock(syncTokenMutex);returnstd::move(syncToken);}我想知道是否有更优雅的方式,比如简单地声明:std::atomic>syncToken;并避免互斥量的需要。或者我可能根本不需要关心这里的锁并且std::move已经是原子的了?经过到目前为止的研究,在我看来:std::move本身不是原子的,需要有一些同步,否则2个

c++ - 如何使具有 unique_ptr 成员的类与 std::move 和 std::swap 一起工作?

我有课。它有一个unique_ptr成员。classA{std::unique_ptrm;};我希望它适用于以下语句Aa;Ab;a=std::move(b);std::swap(a,b);如何制作?根据评论,我有一个问题。这个编译器依赖吗?如果我什么都不做,它无法通过VC++2012的编译。我试过structA{A(){}A(A&&a){mb=a.mb;ma=std::move(a.ma);}A&operator=(A&&a){mb=a.mb;ma=std::move(a.ma);return*this;}unique_ptrma;intmb;};但不确定这是否是最好和最简单的方法。

c++ - 如何避免 VS 中 unique_ptr 检查的性能警告?

这段代码:unique_ptra;if(a){cout甚至这段代码:unique_ptra;if(static_cast(a)){cout导致此警告:warningC4800:'void(__cdecl*)(std::_Bool_struct&)':forcingvaluetobool'true'or'false'(performancewarning)with[_Ty=std::unique_ptr]在VisualStudio2012中,警告级别为3。在第一条评论之后,我发现它只有在公共(public)语言运行时支持/clr被打开时才会发生。我应该如何避免它?if(a.get()!=