草庐IT

c++ - 为什么 push_back 有两个左值和右值重载?

为什么一个类/函数会有两个重载,一个用于左值,一个用于右值?例如,来自this视频,它说我们有两个重载vector::push_backvoidpush_back(constT&value);voidpush_back(T&&value);为什么我们不能只有一个值重载,voidpush_back(Tvalue);如果它是一个左值,值将被复制,如果它是一个右值,值将被move。这不是标准的工作方式和保证方式吗? 最佳答案 根据您的按值提议,技术上会有复制+move或move+move,而对于其他两个重载,只有一个拷贝或一个move。

c++ - 为什么在 g++ 4.4.6 上允许左值到右值引用绑定(bind)?

我正在学习C++11的右值特性。C++Primer第5版说右值引用只能绑定(bind)到右值,但是当我尝试编译这个程序时,它通过了,输出是11。我不明白为什么。我正在使用g++4.4.6,并用编译它g++-Wall-std=c++0xtest.cpp-otest#includeusingnamespacestd;intmain(){inti=0;int&&rr=i;rr=1;std::cout 最佳答案 您的代码无效,左值不能像书上说的那样绑定(bind)到右值引用。g++5.1rejectsyourcode带有错误信息main.c

c++ - 为什么 long int 数据类型的左位移 << 不超过 31?

我想在我的程序中使用以下代码,但gcc不允许我将1左移超过31。sizeof(longint)显示8,那是不是意味着我可以左移到63?#includeusingnamespacestd;intmain(){longintx;x=(~0&~(1编译输出如下警告:leftshift`count>=width`oftype[enabledbydefault]`x=(~0&~(1输出为-1。如果我左移31位,我会得到2147483647,正如int所期望的那样。我希望打开除MSB之外的所有位,从而显示数据类型可以容纳的最大值。 最佳答案 尽

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++ - 有没有办法检测当前成员函数是在左值还是右值上运行?

限定符是一种基于对象上下文重载函数的好方法。此类限定符是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++ - 为什么 operator* of rvalue unique_ptr 返回一个左值?

使用来自“死的”unique_ptr的operator*的返回值是不好的。以下代码可以编译,但当然会导致未定义行为:auto&ref=*std::make_unique(7);std::cout为什么标准没有将std::unique_ptr右值的operator*的返回类型设为内部值的右值,而不是左值,像这样://couldhavebeendoneinsideunique_ptrT&operator*()&{return*ptr;}T&&operator*()&&{returnstd::move(*ptr);}在这种情况下这会工作正常:std::cout(7)但是开头的代码无法编译(无

c++ - 逗号运算符必须是左关联的吗?

根据thisprecedencetable,commaoperator是左结合的。即a,b,c被解析为(a,b),c。那是必要的吗?a,(b,c)不会有完全相同的行为吗? 最佳答案 由于存在可重载的operator,,所以不,这不是相同的行为。a,(b,c)可以调用与(a,b),c不同的重载。 关于c++-逗号运算符必须是左关联的吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions

c++ - 分配内存的表达式是右值表达式还是左值表达式?

假设我有以下代码intmain(){newint;//Isthisexpressionl-valueorr-value??return0;}我知道左值是持久对象(因为它在内存中有特定的位置,即使在表达式结束后我们也可以访问后者)而右值是临时对象(它在内存中没有位置并在表达式结束后消失)。我在一些地方看到它是右值表达式。如果表达式返回一个地址(内存中的特定位置),它怎么可能是右值呢?或者它是右值,因为无论表达式newint返回什么(地址值),它都会消失并且在表达式结束后永远不会被捕获。 最佳答案 newint是一个右值。你不能使用:i

c++ - 方法调用意外地像一个左值

谁能解释为什么thiscode编译:typedefstructlonglong{unsignedlonglow;longhigh;}longlong;typedeflonglongFoo;structFooStruct{private:Foobar;public:voidSetBar(Foom){bar=m;}FooGetBar(){returnbar;}};intmain(){FooStructf;Foom1={1,1};Foom2={2,2};f.SetBar(m1);f.GetBar()=m2;//HereI'dexpectanerrorsuchas//"error:lvalue

c++ - 如何使用可变参数模板在 C++11 中生成左关联表达式(也称为左折叠)?

我想使用C++模板通过二元运算聚合(折叠)多个参数。这样的模板可以按如下方式使用:fold(100,10,5)扩展为add(add(100,10),5)上面显示的特定扩展是“左折叠”。扩展add(100,add(10,5))是“正确的折叠”。假设add函数执行简单的整数加法,左右折叠产生相同的结果,115。但是考虑一个函数div执行整数除法(div(a,b)=a/b)。在这种情况下,关联性很重要,左右折叠会产生不同的结果:fold_left(100,10,5)-->div(div(100,10),5)-->div(10,5)-->2fold_right(100,10,5)-->div(