草庐IT

nothrow_move_constructible

全部标签

c++ - 如何避免错误:在抛出 'std::logic_error' 的实例后调用终止 what(): basic_string::_S_construct null not valid

if(player!=NULL)player->shuffled();我这样做是为了避免将空引用传递给字符串构造函数,但是在编译时仍然会出错。 最佳答案 不知何故,您正在调用std::string构造函数,其中constchar*值为NULL。为了避免这个问题。不要那样做。 关于c++-如何避免错误:在抛出'std::logic_error'的实例后调用终止what():basic_string::_S_constructnullnotvalid,我们在StackOverflow上找到一

c++ - libc++ vs libstdc++ std::is_move_assignable:哪个最正确?

我试图通过阅读C++14标准以及libc++和libstdc++的源代码来更深入地了解C++。各种执行type_traits项目在两者之间有所不同,尤其是is_move_assignable,我试图找出其中哪个“更正确”。libc++:templatestructis_move_assignable:publicis_assignable::type,consttypenameadd_rvalue_reference::type>{};libstdc++:template::value>struct__is_move_assignable_impl;templatestruct__is

c++ - 以下 move 构造函数代码安全吗?

这是类X的move构造函数:X::X(X&&rhs):base1(std::move(rhs)),base2(std::move(rhs)),mbr1(std::move(rhs.mbr1)),mbr2(std::move(rhs.mbr2)){}这些是我很警惕的事情:我们正在从rhs两次move,并且rhs不能保证处于有效状态。这不是base2初始化的未定义行为吗?我们正在将rhs的相应成员move到mbr1和mbr2但由于rhs已被move从(同样,它不能保证处于有效状态)为什么要这样做?这不是我的代码。我在一个网站上找到它。这个move构造函数安全吗?如果有,怎么做?

c++ - 我应该返回一个右值引用(通过 std::move'ing)吗?

一个C++Nextblogpost说过Acompute(…){Av;…returnv;}如果A具有可访问的拷贝或移动构造函数,编译器可能会选择省略拷贝。否则,如果A具有移动构造函数,则移动v。否则,如果A具有复制构造函数,则复制v。否则,会发出编译时错误。我认为我应该总是返回不带std::move的值因为编译器将能够为用户找出最佳选择。但在博客文章的另一个例子中Matrixoperator+(Matrix&&temp,Matrix&&y){temp+=y;returnstd::move(temp);}这里std::move是必要的,因为y必须被视为函数内的左值。啊,读完这篇博文后,我的

c++ - 为了支持 move 语义,函数参数应该由 unique_ptr、value 还是 rvalue 获取?

我的一个函数将vector作为参数并将其存储为成员变量。我正在使用对vector的const引用,如下所述。classTest{public:voidsomeFunction(conststd::vector&items){m_items=items;}private:std::vectorm_items;};但是,有时items包含大量字符串,所以我想添加一个支持move语义的函数(或用新函数替换该函数)。我正在考虑几种方法,但我不确定选择哪一种。1)unique_ptrvoidsomeFunction(std::unique_ptr>items){//Also,make`m_itm

c++ - propagate_on_container_move_assignment 的示例用法

我正在尝试了解如何正确书写AllocatorAware容器。我的理解是,propagate_on_container_move_assignmenttypedef表示Container本身被move-assign时是否需要复制某个Allocator类型。所以,由于我找不到这方面的任何示例,我自己的尝试将类似于以下内容:给定一个容器类型Container、一个Allocator类型allocator_type和一个内部allocator_type数据成员m_alloc:Container&operator=(Container&&other){if(std::allocator_trai

c++ - 默认 move 构造函数/赋值和删除的复制构造函数/赋值

按照标准,IfthedefinitionofaclassXdoesnotexplicitlydeclareamoveconstructor,onewillbeimplicitlydeclaredasdefaultedifandonlyif—Xdoesnothaveauser-declaredcopyconstructor,—Xdoesnothaveauser-declaredcopyassignmentoperator,—Xdoesnothaveauser-declaredmoveassignmentoperator,and—Xdoesnothaveauser-declareddest

c++ - 为什么我不能在 C++14 的 lambda 中 move std::unique_ptr?

我想在lambda中传递一个原始指针,但如果未调用lambda,我不希望它被泄露。它看起来像这样:voidClean(std::unique_ptr&&list);voidf(int*list){thread_pool.Push([list=std::unique_ptr(list)]{Clean(std::move(list));//我在Clang3.7.0中遇到错误:error:bindingofreferencetotype'unique_ptr'toavalueoftype'unique_ptr'dropsqualifiers但我一开始没有看到任何限定词,尤其是被丢弃了。另外,

c++ - 为什么在 lambda 中 move 时不调用 move 构造函数?

我正在尝试编译以下代码:#includestructC2{C2()=default;C2(C2const&)=delete;C2(C2&&)=default;};intmain(){C2p2;([p2_1{std::move(p2)}](){autop2_2=std::move(p2_1);//但是,这不会编译并给出一个错误,即对p2_2的赋值正在调用已删除的函数,即复制构造函数。请注意,move到p2_1很好。为什么不使用move构造函数? 最佳答案 这里要注意的是,lambda表示的匿名类类型的operator()默认为cons

c++ - 将 move 语义与 std::pair 或 std::tuple 一起使用

假设您想利用move语义,但您的一个可move类需要成为std::pair的一部分。目的是创建一个返回std::pair的函数,该函数可以被视为右值并转发。但我不知道如何做到这一点,除非对std::pair本身进行内部更改,以使其了解move语义。考虑以下代码:structFoo{Foo(){}Foo(Foo&&f){}private:Foo(constFoo&f){}//donotallowcopying};intmain(){Foof;std::pairres=std::make_pair(f,10);//failsduetoprivatecopyconstructor}问题在于s