草庐IT

c++ - 如何在 C++ 中使用右值引用来避免不必要的实例

我想创建一个自定义容器Container将数据存储在单独的数组中。但是,为了便于对容器进行迭代,我通过重载operator[]并返回一个包含所有容器变量的结构Value来提供容器的“View”对实际容器的引用。这是我到目前为止得到的:#includeusingnamespacestd;structValue{Value(int&data):data_(data){}int&data(){returndata_;}int&data_;};structContainer{ValuemakeValue(inti){returnValue(data_[i]);}//EDIT1Value&&op

c++ - 同一对象的双 move 是从左向右复制吗?

我只是c++11中move操作的初学者,所以玩它。但是发现了一些我无法理解的东西。#includeusingnamespacestd;classA{public:A(){coutCORRECT!!coutCORRECT!!b=std::move(a);//idon'tknowmaybesillybutstillletsdoitWHYNOT!!!,couldbejustmistake??coutWRONG!!coutWRONG!!}我原以为b=std::move(a)操作会有所不同,因为我第二次在对象a上应用move,但它正在向左复制侧面对象b到右侧对象a,这部分我不明白。或者我在编程中

c++ - c++ 右对齐输出

#include#includeusingnamespacestd;intmain(){cout为什么这会导致输出如下:HelloWorldGoodbyeWorld而不是:HelloWorldGoodbyeWorld我在这里做错了什么?编辑:#include#includeusingnamespacestd;intmain(){cout如果我尝试这样做,为什么“今天”部分未对齐? 最佳答案 改变运算符的顺序来解决这个问题:#include#includeintmain(){std::cout您必须将所有运算符放在您要格式化的值之前。

c++ - 命名右值引用

请原谅我在这个话题上不够清晰。我正在尝试创建用于将大类插入vector的函数。在这个例子中,我使用整数vector作为大类。#include#includeusingnamespacestd;vector>vectorOfVectors;voidfn(constvector&v){vectorOfVectors.push_back(v);}voidfn(vector&&v){vectorOfVectors.push_back(std::move(v));}intmain(){vectora({1});constvectorb({2});fn(std::move(a));fn(b);co

c++ - 为什么右值引用会被通用引用变成左值引用

我想当通用引用参数与右值引用参数匹配时,将返回右值引用参数。然而,我的测试表明右值引用被通用引用函数模板变成了左值引用。为什么会这样?#include#includeusingnamespacestd;templateTf1(T&&t){//::value::value::value::value::value::value在GCC和VC++2010中,都是这样的结果:f2is_lvaluereference:0f2is_rvaluereference:1f2is_reference:1is_lvaluereference:1is_rvaluereference:0is_referen

c++ - 这个表达式是左值还是右值?

看看这个表达式:Tt;T&ref=t;ref表达式是左值还是右值?我相信它是右值因为ref没有“指定函数或对象”:"Anlvalue(socalled,historically,becauselvaluescouldappearontheleft-handsideofanassignmentexpression)designatesafunctionoranobject."[开放标准草案n3092]根据cppreference,引用不是对象。"Thefollowingentitiesarenotobjects:value,reference[...]"我有疑问,因为ref在=的左侧。

c++ - 停止右值调用移动赋值 C++ 11

考虑一个我不想修改的简单C++类:classfoo{};然后,如果我执行以下操作,我将调用移动赋值运算符:foof{};f=foo{};有没有一种方法可以在不修改foo或使用中间g的情况下调用复制分配,如下所示:foof{};foog{};f=g;几乎就像有std::dont_move一样! 最佳答案 std::dont_move()很容易自己实现:templateconstT&force_copy(T&&v){returnv;}参见usageexample 关于c++-停止右值调用移动

c++ - 使用右值引用和自动

鉴于下面的代码,一切正常。为什么变量d是对int的引用?这是怎么回事?intmain(){inta=10;int&&b=a+10;//bisint&&autoc=b+10;//cisintauto&&d=a;//disint&//int&&di=a;//error,asexpectedreturn(0);} 最佳答案 这与类型推导中的引用折叠规则有关。A&&becomesA&A&&&becomesA&A&&&becomesA&A&&&&becomesA&& 关于c++-使用右值引用和自动

c++ - 防止通过引用传递右值

在我的项目中,大多数对象都是在arena中创建的,并且保证它们在用户session期间存在。所以对于某些类来说,将const引用作为成员字段是非常安全的,例如:classA{public:A(conststring&str):str_(str){}private:conststring&str_;};但是这里有一个陷阱。可能会错误地通过以下方式创建A的实例:Aa("sometemporalstringobject");在该行中,时间string对象已被隐式创建和销毁。所以在那之后a存储了不正确的引用。如何防止这种行为?要是编译出错就更好了... 最佳答案

c++ - 如果右值没有绑定(bind)到 const 引用,这将如何影响移动语义和完美转发?

在http://www.reddit.com/r/IAmA/comments/1nl9at/i_am_a_member_of_facebooks_hhvm_team_a_c_and_d/ccjm2qs,AndreiAlexandrescu写道:IthinkbindingrvaluestoconstreferenceshasbeenthesmallmistakethatcausedthervaluereferencesHindenburg...Itwouldbealongdiscussion.Bindingrvaluestoconst&madesensewhenfirstintroduc