草庐IT

c++ - 使用右值/左值理解模板参数推导

这是来自functiontemplatedoesnotrecognizelvalue的跟进让我们玩一下下面的代码:#includetemplatevoidfunc(T&&){std::coutvoidfunc(constT&){std::cout(n);func(n);}它打印:inlvalueinrvalue我不明白第二次通话中发生了什么。如何编译解析模板参数?为什么没有任何歧义? 最佳答案 当你说func(n),没有参数推导,因为你指定了参数,所以选择在func(double&&)之间。和func(constdouble&).前

c++ - 将左值传递给右值

我做了一个小的“阻塞队列”类。令我恼火的是,我为传递到enqueue成员函数的值创建了冗余代码。这两个函数做同样的事情(除了右值使用std::move将右值移动到实际的队列集合中),除了分别处理左值和右值:voidenqueue(constT&item){std::unique_locklock(m);this->push(item);this->data_available=true;cv.notify_one();}voidenqueue(T&&item){std::unique_locklock(m);this->push(std::move(item));this->data_

c++ - decltype 可以声明一个右值吗?

//CompiledbyVisualStudio2012structA{booloperator==(constA&other)const{for(decltype(this->n)i=0;in)i=0;i这是VC++2012的错误吗? 最佳答案 这似乎是一个VS2012编译器错误。规范在7.1.6.2节的第4段中对此非常清楚。实际上,给出的示例之一显示了通过常量指针a引用的表达式。decltype(a->x)产生double,而decltype((a->x))产生doubleconst&.所以这是一个错误;编译器认为i是const

c++ - 获取右值引用的地址是什么意思?

给定voidfoo(int&&x){std::cout这可行,但这个地址实际上代表什么?是临时的int在调用foo时创建,这就是地址所代表的内容?如果这是真的,如果我写inty=5;foo(static_cast(y));,这会导致创建另一个临时文件还是编译器会智能地引用y? 最佳答案 当您获取右值引用的地址时,它会返回指向该引用绑定(bind)到的对象的指针,就像左值引用一样。该对象可以是临时对象,也可以不是临时对象(例如,如果您像在代码中那样将左值引用转换为右值引用)。inty=5;foo(static_cast(y));不会创

c++ - 您如何记住右值、左值等之间的区别?

Thisquestion很棒,因为它可以回答rvalue之间的区别,lvalue,xvalue,glvalue,和prvalue.最佳答案对每一个都有很好的解释,当我阅读它们时,我理解它们的区别。但是,我很难将它们牢记在心,每次有人使用这些术语时,我都必须用谷歌搜索它们,以提醒自己哪个是哪个。是否有任何常见的助记符或其他方式让人们记住哪个是哪个?我真的很希望能够将它们全部记在脑海中,而不像现在这样混淆它们。 最佳答案 我有两个联想:你只能取一个左值的地址xvalues是一个std::move表达式如果两者都不是,那么它可能是一个纯右

c++ - 在 C++11 中使用右值引用

我想实现一个填充vector然后返回右值引用的函数。我厌倦了这样的事情:std::vector&&fill_list(){std::vectorres;...dosomethingtofillres...returnres;}intmain(intargc,char**argv){std::vectormyvec=fill_list();return0;}但这不起作用,我收到以下错误:error:invalidinitializationofreferenceoftype'std::vector&&'fromexpressionoftype'std::vector'那么,总而言之,正确

c++ - 我如何使用 iomanip 的 setw、setfill 和左/右? Setfill 不会停止其输出

我试图让我的输出看起来像这样:sizetime1time2-------------------------------104810048161000293792210000123011390210000022407380830722我知道我需要使用setw()、setfill()和left。但是,我的尝试一直给我错误的输出。这是我的代码的一个示例:std::cout这是输出:sizetime1time2------------------------------------------------------------103-------------------13--------

c++ - 来自右值的非常量类型引用

考虑以下代码:classWidget{};templateT&&foo2(T&&t){returnstd::forward(t);}///Return1stelementtemplatetypenamestd::tuple_element::type>::type&&foo(T&&t){returnstd::forward::type>::type>(std::get(t));}Widgetw;autolist=std::make_tuple(w,Widget());intmain(){auto&l=foo(list);//ThisisNOTwork//auto&l2=foo2(std

c++ - 有没有办法检测当前成员函数是在左值还是右值上运行?

限定符是一种基于对象上下文重载函数的好方法。此类限定符是const和volatile。但是,为它们编写代码很烦人,因为它们通常是重复代码,因为cv限定符至少由this传播。因此,我们可以使用传播技巧并借助auto或decltype(auto)使整个函数(无cv限定符)完全相同。例如:structX{intm_i=0;auto&i()&{returnm_i;}//returnsint&auto&i()volatile&{returnm_i;}//returnsintvolatile&auto&i()const&{returnm_i;}//returnsintconst&auto&i()c

c++ - 关于右值引用的一些说明

首先:std::move和std::forward在哪里定义?我知道它们的作用,但我找不到任何标准header需要包含它们的证据。在gcc44中,有时std::move可用,有时不可用,因此明确的include指令会很有用。在实现移动语义时,源可能处于未定义状态。该状态是否一定是对象的有效状态?显然,您需要能够调用对象的析构函数,并能够通过类公开的任何方式分配给它。但是其他操作应该有效吗?我想我要问的是,如果您的类保证某些不变量,当用户表示他们不再关心这些不变量时,您是否应该努力强制执行这些不变量?下一步:当您不关心移动语义时,是否有任何限制会导致在处理函数参数时优先使用非常量引用而不