草庐IT

nothrow_move_constructible

全部标签

c++ - 在这里真的有必要将 std::move 放在 lambda 中吗?

我真的必须将std::move调用封装在lambda中吗?std::listsrcData=GetData();//implementationnotimportantstd::vectordstData;dstData.reserve(srcData.size());std::transform(std::begin(srcData),std::end(srcData),std::back_inserter(dstData),[](std::wstring&guid)->std::wstring{returnstd::move(guid);});srcData.clear();我对l

c++ - std::move 模板参数是如何推导出来的?

假设我们有:foo(A&&a);如果你这样做Aa;foo(a);它不会编译并且提示不能将左值绑定(bind)到A&&。很好。然而,鉴于std::move的签名,templatetypenameremove_reference::type&&std::move(T&&a);看起来它需要一个右值引用,就像在foo中一样,为什么下面的代码符合要求?Aa;std::move(a);a不是左值吗?此外,据说编译将实例化:typenameremove_reference::type&&std::move(A&&&a);我不明白为什么不是:typenameremove_reference::type

c++ - 在 vector 中使用没有拷贝且没有 noexcept move 构造函数的对象。到底是什么坏了,我该如何确认?

我检查了很多moveconstructor/vector/noexcept线程,但我仍然不确定当事情应该出错时实际发生了什么。我无法按预期产生错误,所以要么我的小测试有误,要么我对问题的理解有误。我正在使用BufferTrio对象的vector,它定义了一个noexcept(false)move构造函数,并删除了所有其他构造函数/赋值运算符,这样就没有什么可以回退到:BufferTrio(constBufferTrio&)=delete;BufferTrio&operator=(constBufferTrio&)=delete;BufferTrio&operator=(BufferTr

c++ - move 语义和完美转发的区别

我已经从这个问题中得到了什么是move语义:Whataremovesemantics?但我仍然不明白与move语义相关的完美转发是什么。谁能用简单的英语和一个简单的例子解释一下什么是完美转发? 最佳答案 纯英语尝试这个问题可能太复杂了,无法用简单的英语句子准确描述,但可以将完美转发视为一种将传递给一个函数的临时值move到另一个函数的方法,就好像第一个函数没有完全存在,因此没有任何不必要的拷贝或分配。当您尝试获取引用(右值或左值)时,C++11允许您通过在类型的右值(&&)和左值(&)引用之间引入一些转换规则来执行此操作R值引用是C

c++ - Clang 问题 : implicit type conversion at construction time

概要我正在努力使C++11代码与Clang兼容,并遇到了GCC>=4.6接受代码而Clang>=3.1不接受的情况。Clang认为候选构造函数不可行。详情这里是一个精简的例子来说明这个问题:#includetemplatestructT;templatestructT{typedefTsuper;constexprT(){}templateT(Args&&...){}};templatestructT:T{typedefTsuper;Headhead;T(Headarg):super(),head(std::move(arg)){}};structvoid_type{constexpr

c++ - 添加 move 构造函数会破坏二进制兼容性吗?

如果我将一个move构造函数(或move赋值运算符)添加到我的库中,我会破坏二进制兼容性吗?这种添加会以任何方式破坏用户的代码吗?classFoo{public:Foo();Foo(Fooconst&);Foo&operator=(Fooconst&);//newmethods:Foo(Foo&&);Foo&operator=(Foo&&);}; 最佳答案 在我看来,只要您不添加成员或虚函数,就不会对二进制兼容性产生任何影响,因为对象的布局不会改变。如果一个组件(比如共享库,Windows上的.dll或Linux上的.so)使用旧版

c++ - 堆栈可以有一个异常安全的方法来返回和删除具有 move 语义的顶部元素吗?

在对关于std::stack::pop()的问题的回答中Iclaimedpop不返回值的原因是出于异常安全原因(如果复制构造函数抛出会发生什么)。@Konrad评论说现在有了move语义,这不再相关。这是真的吗?据我所知,move构造函数canthrow,但也许与noexcept它仍然可以实现。对于奖励积分,此操作可以提供哪些线程安全保证? 最佳答案 当然,并非所有类型都支持move,C++0x甚至允许抛出move构造函数。只要从右值构造对象可能会抛出它就不可能是异常安全的。但是,move语义允许您拥有许多在给定右值源的情况下不可抛

c++ - libc++ is_copy_constructible 对我来说似乎是错误的

is_copy_constructible的libc++实现是这样的:templatestruct_LIBCPP_TYPE_VIS_ONLYis_copy_constructible:publicis_constructible::type>{};is_copy_constructible的C++规范很简单:std::is_copy_constructiblespecification:std::is_constructible::valueistrue.但是,上面的实现不就是实现了T&const而不是constT&吗?将const应用于add_lvalue_reference应该没有

c++ - 使用 move 构造函数抛出异常? (C++)

如果我有一个Error类型的对象e实现了一个move构造函数,将抛出std::move(e)使用将Error的构造函数move到“复制”e,那么它是否避免制作对象的实际拷贝?所以如果我有Errore;throwstd::move(e);Error的拷贝构造函数会不会被调用?当您的move构造函数是noexcept(它应该是)但您的复制构造函数不是时,这很有趣。 最佳答案 §15.1[except.throw]:Throwinganexceptioncopy-initializes(8.5,12.8)atemporaryobject,

c++ - 在 C++ 中将通用构造函数分配给成员变量时的 std::move 或 std::forward

考虑以下类foo1和foo2templatestructfoo1{Tt_;foo1(T&&t):t_{std::move(t)}{}};templatestructfoo2{foo1t_;foo2(T&&t):t_{std::forward(t)}{}};foo1的构造函数总是这样吗?表示初始化成员变量的正确方式T?即通过使用std::move.foo2的构造函数总是这样吗?表示初始化成员变量的正确方式foo1由于需要转发给foo1的构造函数?即通过使用std::forward.更新以下示例因foo1而失败使用std::move:templatefoo1make_foo1(T&&t){