草庐IT

c++ - 为什么 C++11/14 中的 std::forward 没有 std::move_if_noexcept 对应项?

我观看了ScottMeyers在GoingNative2013“AnEffectiveC++11/14Sampler”上的演讲,他解释了std::move_if_noexcept的使用。所以我认为应该有一个std::forward_if_noexcept来保证forward的异常安全?为什么标准库中没有这样的东西?有没有其他保证的可能? 最佳答案 前向语义已经是有条件的,即它们保留其参数的值类别。另一方面,移动无条件地将其参数的值类别(从左值变为右值)更改为右值(引用),std::move_if_noexcept获得基于移动构造函数

c++ - 对象返回时是否保证被 move ?

我知道,当通过值传递一个对象给函数时,如果有一个move构造函数,总是会调用它,假设没有复制省略。按值返回对象呢?例如,假设我们有一个类Foo,它有一个move构造函数,我们有一个返回Foo对象的函数。Foog(){Foof;//dosomethingwithfreturnf;}如果我们假设没有RVO,是否保证调用move构造函数?更新:我想我没有清楚地表明我的意图。我只是想知道在最坏的情况下我可以让对象move而不是复制。RVO或NRVO发生,我很高兴。而且我还应该说move构造函数和move赋值没有被删除,并且是正确实现的。 最佳答案

c++ - ifstream的move构造函数是否被隐式删除?

我有以下简单的类:classSource{public:Source()=default;Source(Sourceconst&)=delete;Source(Source&&)=default;explicitSource(std::stringconst&fileName):inputStream(fileName),path_(fileName){}~Source()=default;autopath()const->std::string{returnthis->path_;}std::ifstreaminputStream;private:std::stringpath_;}

c++ - vector 重新分配使用复制而不是 move 构造函数

您好,我使用gcc4.7创建了一个带有noexceptmove构造函数的类Foo,并将vector保留大小设置为2,以便在添加第三个项目时它必须重新分配大小。执行此操作时,它似乎调用了复制构造函数而不是move构造函数。我在这里遗漏了什么吗?#include#includeclassFoo{public:Foo(intx):data_(x){std::coutv;v.reserve(2);v.emplace_back(1);std::cout输出:constructingAdded1constructingAdded2constructingCopyconstructingCopyco

c++ - move 构造函数可以是隐式的吗?

考虑以下类:classA{public:std::stringfield_a;std::stringfield_b;}现在考虑以下复制结构:Aa1(a2);尽管没有显式的复制构造函数,复制构造仍将充分复制A,因为std::string的复制构造函数将由编译器生成的隐式调用复制构造函数。我想知道的是,move构造是否也是如此?编辑:测试here表明:Aa2(std::move(a1));实际上会导致复制构造,除非特定的move构造函数:A(A&&other):a(std::move(other.a)){}已定义。编辑编辑我联系了StephanTLavavej,问他为什么VC2012似乎没

c++ - 是否返回 std::move (x)?

是std::vectorfoo(){std::vectort;...returnt;}和std::vectorfoo(){std::vectort;...returnstd::move(t);}等价的?更准确地说,returnx是否总是等价于returnstd::move(x)? 最佳答案 它们不等价,您应该始终使用returnt;。更长的版本是,当且仅当return语句符合返回值优化条件时,returnee才会绑定(bind)到右值引用(或者通俗地说,“move是隐式的”)。但是,通过拼写returnstd::move(t);,您

c++ - 重载算术中的 move 语义和传递右值引用

我正在用C++编写一个小型数值分析库。我一直在尝试使用包括move语义在内的最新C++11特性来实现。我理解以下帖子中的讨论和最佳答案:C++11rvaluesandmovesemanticsconfusion(returnstatement),但有一种情况我仍在尝试解决。我有一个类,叫它T,它完全配备了重载运算符。我也有复制和move构造函数。T(constT&){/*initializationviacopy*/;}T(T&&){/*initializationviamove*/;}我的客户端代码大量使用运算符,因此我试图确保复杂的算术表达式从move语义中获得最大yield。考虑

c++ - 通过 mapped_type 的 r 值 move 插入映射条目

我有一个(相当)简单的键类型和复杂的映射类型的map,如下所示:map>myMap;如果我有vector手头,是否可以在复制键但move映射值的映射中插入一个条目?也就是说,有没有办法:stringkey="Key";vectormapped;for(inti=0;i 最佳答案 您正在寻找std::map::emplace:myMap.emplace(key,move(mapped));这会就地调用适当的std::pair构造函数:templatepair(U1&&x,U2&&y);由于第一个参数是左值,因此键被复制,但第二个(映射

c++ - 如何为 std::for_each 中的 lambda 捕获 std::unique_ptr "by move"

我正在学习c++11中的新功能并遇到了这个问题。我想通过将其移动到lambda中作为for_each的参数来捕获unique_ptr。设置:std::arrayarr={1,3,5,6};std::unique_ptrp(newint);(*p)=3;尝试1-不起作用,因为unique_ptr没有复制构造函数。c++0x没有指定passbymove语法。std::for_each(arr.begin(),arr.end(),[p](int&i){i+=*p;});尝试2-使用bind将p的移动拷贝绑定(bind)到采用int&的函数:std::for_each(arr.begin(),

c++ - 何时在函数调用中使用 move

这个问题在这里已经有了答案:Whatisstd::move(),andwhenshoulditbeused?(8个回答)关闭3年前。我目前正在学习有关所有c++11/14功能的更多信息,并想知道何时在函数调用中使用std::move。我知道在返回局部变量时我不应该使用它,因为这会破坏返回值优化,但我真的不明白在函数调用中强制转换为右值实际上有什么帮助。 最佳答案 当一个函数接受一个右值引用时,你必须提供一个右值(或者通过已经有一个右值,或者使用std::move创建一个xvalue)。例如voidfoo(std::string&&s