草庐IT

c++ - 左值到右值的转换

从4.1/2Thevaluecontainedintheobjectindicatedbythelvalueisthervalueresult.Whenanlvalue-to-rvalueconversionoccurswithintheoperandofsizeof(5.3.3)thevaluecontainedinthereferencedobjectisnotaccessed,sincethatoperatordoesnotevaluateitsoperand.出于好奇,我在想,这是否同样适用于if、for、while语句,即在计算语句结果时将左值转换为右值?

c++ - 右值引用是否与左值引用具有相同的开销?

考虑这个例子:#include//runtimedominatedbyargumentpassingtemplatevoidfoo(Tt){}intmain(){inti(0);foo(i);//fast--intisscalartypefoo(i);//slow--lvaluereferenceoverheadfoo(std::move(i));//???}是foo(i)和foo(i)一样快,或者它是否涉及像foo(i)这样的指针开销?编辑:按照建议,运行g++-S给了我相同的51行汇编文件foo(i)和foo(i),但是foo(std::move(i))产生了71行汇编代码(看起来

c++ - move 左值引用参数是不好的做法吗?

我最初认为move左值引用参数是不好的做法。C++开发人员社区确实普遍认同这一点吗?当我调用一个具有R值引用参数的函数时,很明显我必须期望可以move传递的对象。对于具有L值引用参数的函数,这并不是那么明显(在C++11引入move语义之前,这根本不可能)。但是,我最近采访过的其他一些开发人员不同意应避免move左值引用。是否有强有力的论据反对它?还是我的意见有误?由于我被要求提供一个代码示例,这里有一个(见下文)。这是一个仅用于演示问题的人为示例。很明显,在调用modifyCounter2()之后,再调用getValue()会导致segmentationfault。但是,如果我是ge

c++ - 迭代单个左值

我想将单个左值传递给需要一对迭代器的函数,并且它的行为就像我将一对迭代器传递给仅包含该值的范围一样。我的做法如下:#include#includetemplatevoiditerate_over(Iterbegin,Iterend){for(autoi=begin;i!=end;++i){std::couta{1,2,3,4};iterate_over(a.cbegin(),a.cend());intb=5;iterate_over(&b,std::next(&b));}这在g++5.2中似乎可以正常工作,但我想知道这是否是实际定义的行为,是否存在任何潜在问题?

c++ - 无法将左值绑定(bind)到右值引用

这个问题在这里已经有了答案:passingrvalueraisescannotbindtolvalue(1个回答)关闭12个月前。我有这个C++测试代码片段,#includeclassA{std::vectorx;public:A(std::vector&&_x):x(_x){}};classB{Aa;public:B(std::vector&&_x):a(/*move(*/_x/*)*/){}};我将_x作为右值引用传递给B,但在传递给A的构造函数时它被转换为左值,我必须使用std::move()使其工作。我的问题是为什么_x是左值而不是a()中的右值引用?

c++ - (右值引用)VS(const 左值引用)作为 C++11 中的函数参数

谁能解释一下当右值引用作为函数参数时优先于const左值引用的情况?背景:我试图将一个const指针传递给一个函数。由于我必须考虑传入局部指针和传入临时指针的情况(比如从函数调用返回),我有两种选择:参数可以声明为:voidfoo(Tconst*const&);//constlvaluereftoconstptr或voidfoo(Tconst*&&);//rvaluereftoconstptr但是这个右值引用不能绑定(bind)到局部变量(它是左值类型。但我确实记得ScottMeyers创造了术语“通用引用”来指代右值引用。这让我更加困惑。)所以我的问题是,由于第一个声明可以处理这两种

c++ - 将非左值作为 const 引用参数传递。 temp 是在本地作用域还是在调用者作用域中创建的?

好的,所以,我已经知道返回一个局部变量作为引用会在我们尝试使用它时导致未定义的行为,并且我们可以创建一个非常量引用来仅形成一个左值变量。创建const引用不需要从左值变量创建,因为如果它是从非左值变量创建的,它会在该范围内创建一个临时引用(下面的代码)。constint&refa{2};//basicallyequalsconstinttemp_a{2};constint&refa{temp_a};我的问题是,如果我们将非左值作为参数传递给采用const引用的函数,临时变量是在调用者的本地范围内创建还是在函数的本地范围内创建?我很好奇是否将参数作为引用返回并使用它会导致未定义的行为。示

ios - 左值需要作为 ios 中赋值的左操作数

这是我的代码[[XobjectAtIndex:i]doubleValue]=([[XobjectAtIndex:i-1]doubleValue]*[[XobjectAtIndex:1]doubleValue]);其中X是double数组谢谢 最佳答案 要设置值,您必须使用set方法,如下所示:doubled=[[XobjectAtIndex:i-1]doubleValue]*[[XobjectAtIndex:1]doubleValue];[[XobjectAtIndex:i]setDoubleValue:d];

c++ - 将右值绑定(bind)到 const 左值引用

这个问题在这里已经有了答案:Whynotnon-constreferencetotemporaryobjects?[duplicate](4个答案)关闭4个月前。出于某种原因,我没能找到这个确切的问题。为什么允许将rvalue绑定(bind)到const左值引用,尽管没有const是不可能的?我确实理解右值的生命周期以某种方式得到了扩展(在第一种情况下),但如果是这样,为什么编译器会禁止更改那个“右值”,它不再是一个真正的临时对象。例如,考虑以下代码:intmain(){int&i=3;//produceserrorconstint&j=3;//compilesreturn1;}

c++ - 为什么 T& 类型的模板函数参数可以绑定(bind)到 const 左值而不是右值?

考虑:templatevoidf(T&);constintb=2;f(b);//okf(2);//error,cannotbindrvaluetolvaluereference为什么是f(constint)允许?逻辑似乎表明,如果程序员没有明确定义模板参数为constT&,他/她想修改绑定(bind)变量。所以在这种情况下,问题是,为什么模板实例化在没有明确要求的情况下让自己可以自由地使用consts进行实例化?即使有允许模板实例化用const实例化的理由,那么为什么在那种情况下会禁止绑定(bind)到右值?您可以将右值绑定(bind)到const左值引用。在这种情况下,模板将被实例化