草庐IT

c++ - 如何在模板中存储右值或左值引用

我正在尝试创建一个简单的模板enumerator类,它应该接受定义了:运算符的任何对象,然后打印(i,v[i]).一个简单的实现如下:templatestructenumerator{T&v;//referencetominimizecopyingenumerator(T&_v):v(_v){}voiddo_enumerate(){size_ti=0;for(autox:v){cout这适用于以下情况:案例Avectorv({1,2,6,2,4});autoe=enumerator(v);e.do_enumerate();但是,我也希望它能处理临时对象,例如:案例Bautoe=enum

c++ - 为什么我可以 std::move 流右值引用到左值引用?

据我了解C++11引用,我不应该能够将右值引用绑定(bind)到(非常量)左值引用,因为前者可能绑定(bind)到临时对象,而后者绝不能绑定(bind)到一个临时的。但是我发现这种奇怪的行为与临时流对象有关(我尽可能地减少了)structDummy{};templateStream&operatorvoidpass(Stream&&s){std::move(s)lvalueconversion?}#includeintmain(){pass(std::fstream("test",std::ios::out));}如果我写s在线(X),C++在(A)行提示,说error:invalid

c++ - const 左值引用和右值引用之间的重载解析

#include#includevoidfnc(conststd::string&){std::cout所有编译器都选择std::string&&版本的fnc,这是合乎逻辑的,因为创建了临时的std::string用于引用绑定(bind),但我找不到它在C++14标准中的描述。我在那里找到了一段(3.2):—StandardconversionsequenceS1isabetterconversionsequencethanstandardconversionsequenceS2if[...]—S1andS2arereferencebindings(8.5.3)andneitherre

c++:函数左值或右值

我刚刚开始通过阅读thispage了解c++11中的右值引用,但我卡在了第一页。这是我从该页面获取的代码。int&foo();foo()=42;//ok,foo()isanlvalueint*p1=&foo();//ok,foo()isanlvalueintfoobar();j=foobar();//ok,foobar()isanrvalueint*p2=&foobar();//error,cannottaketheaddressofanrvalue为什么foo()是左值?是因为foo()返回的int&基本上是一个左值吗?为什么foobar()是右值?是因为foobar()返回int吗

c++ - lambda 表达式的右值和左值引用 - gcc 与 msvc

在C++中,将右值隐式转换为左值引用是非法的。考虑以下代码,其中左值引用绑定(bind)到右值(lambda):intmain(){auto&f=[]()->void{};return0;}gcc(4.8.1)不接受这样的代码(完全有道理)。但是,Microsoft编译器确实接受它,这意味着它要么接受非标准代码,要么C++允许左值引用绑定(bind)到右值lambda表达式的特殊情况。问题:哪个假设是正确的? 最佳答案 您问题的核心是:rvalues可以绑定(bind)到non-constlvalue引用吗?标准说不。rvalues

c++ - 右值是否作为参数传递给函数内部的左值?

我有一个View和一个Shape类,其中View“拥有”它的Shape对象。我将其实现为unique_ptr的vector。在函数View::add_shape(std::unique_ptr&&shape)中,我仍然需要在右值参数上使用std::move使其编译。为什么?(使用GCC4.8)#include#includeusingnamespacestd;classShape{};classView{vector>m_shapes;public:voidadd_shape(unique_ptr&&shape){m_shapes.push_back(std::move(shape))

c++ - 在 C++ 类中初始化数组和可修改的左值问题

我有一个基本的C++类。标题如下所示:#pragmaonceclassDataContainer{public:DataContainer(void);~DataContainer(void);int*getAgeGroup(void);int_ageGroupArray[5];private:int_ageIndex;};现在在类的cpp文件中,我想在类构造函数中使用默认值初始化_ageGroupArray[5],如下所示:#include"DataContainer.h"DataContainer::DataContainer(void){_ageGroupArray={20,32

c++ - 将右值引用传递给 const 左值引用参数

我正在尝试理解C++11右值引用以及如何在我的代码中使用它们来实现最佳性能。假设我们有一个类A,它有一个指向大量动态分配数据的成员指针。此外,一个方法foo(constA&a)对类A的对象执行某些操作。当A的对象被传递给函数foo时,我想阻止A的复制构造函数被调用,因为在这种情况下,它将执行底层堆数据的深层复制。我测试了传递一个左值引用:Aa;foo(a);并传递一个右值引用:foo(A());在这两种情况下,复制构造函数都没有被调用。这是预期的还是由于我的编译器(AppleLLVM5.1)的一些优化?有没有这方面的规范? 最佳答案

c++ - 为什么 const 左值引用可以引用可变右值引用?

在C++11中,const左值引用可以用可变右值引用来初始化。右值引用的值然后可以更改,从而对const左值所引用的内容产生可见的突变。这是一个例子:int&&rval=3;constint&lval=rval;cout输出(来自clang3.2和gcc4.8.2,均使用-std=c++11):lval=3rval=3lval=4我会猜测这样做的原因是不能通过左值引用修改所指对象,但可以通过右值引用修改它。但是,我不明白为什么允许const左值引用可变对象。有人能解释一下这样做的理由并给出处理这种情况的最佳做法吗?另外,是否还有其他类似的例子可以颠覆constness?

c++ - 为什么右值引用作为左值引用传递?

pass()引用参数并将其传递给reference,但是右值参数实际上调用了reference(int&)而不是reference(int&&),这是我的代码片段:#include#includevoidreference(int&v){std::coutvoidpass(T&&v){reference(v);}intmain(){std::cout输出是:rvaluepass:lvaluelvaluepass:lvalue对于p,根据referencecollapsingrule很容易理解,但是为什么模板函数将v传递给reference()作为左值? 最佳