草庐IT

弱引用

全部标签

c++ - 使用右值引用延长临时对象的生命周期

Accordingtoanotheranswer,如果引用它的表达式是一个xvalue表达式,则右值引用不会延长临时对象的生命周期。因为std::move返回一个右值引用,调用它的表达式是一个xvalue,所以下面的结果是一个悬空引用:intmain(){std::string&&danger=std::move(get_string());//danglingreference!return0;}没关系。std::move在这里没有意义;它已经是一个右值。但这是我要画空白的地方。这与将xvalue表达式作为参数传递、完全标准地使用std::move和右值引用有何不同?voidfoo(

c++ - 重载引用与 const 引用

我有以下代码:#includetemplatevoidf(T&x){std::coutvoidf(constT&x){std::cout输出是:f(T&)f(constT&)我的问题是:编译器如何知道调用哪个函数?如果我从函数定义中删除引用,则会收到“模糊调用”类型的错误,即error:redefinitionof'f'。对我来说,看起来f(T&)可以同样很好地用于这两个调用,为什么const版本明确地调用了f(b)? 最佳答案 给定两个相互竞争的重载,该标准要求编译器选择“最适合”的重载。(如果没有唯一的最佳重载,或者唯一的最佳重

c++ - 为什么可以间接地将右值绑定(bind)到左值引用而不是直接绑定(bind)?

根据我的阅读和了解,您不能将右值表达式绑定(bind)到左值引用。然而,我所看到的是,您可以将右值绑定(bind)到右值引用,并且由于命名的右值引用本质上是左值,因此您可以将它绑定(bind)到左值引用。不允许将右值绑定(bind)到左值引用背后的原因是什么。是否出于优化目的?举个例子:#includeusingstd::cout;voidbar(int&b){cout 最佳答案 这是C++的基本规则,它可以防止错误:intfoo();int&x=3;//whoopsint&y=foo();//whoops(sometimes)“右

c++ - 取消引用一个等于 nullptr 的指针是标准未定义的行为吗?

一位博客作者提出了关于空指针解引用的讨论:http://www.viva64.com/en/b/0306/我在这里提出了一些反驳论点:http://bit.ly/1L98GL4他引用标准的主要推理是这样的:The'&podhd->line6'expressionisundefinedbehaviorintheClanguagewhen'podhd'isanullpointer.TheC99standardsaysthefollowingaboutthe'&'address-ofoperator(6.5.3.2"Addressandindirectionoperators"):Theop

c++ - 如何在没有编译器警告的情况下返回对空字符串的 const 引用?

我有一个std::unordered_map和一个函数GetString(intkey)它接受一个int键并从此映射返回一个字符串值。当在映射中找不到键时,我必须返回一个空字符串。#include#include#includestd::unordered_mapmap{{5,"somelongstring"}};conststd::string&GetString(intkey){autoiterator=map.find(key);if(iterator==map.end()){return"";}returniterator->second;}intmain(){std::cou

JUC并发编程学习笔记(十九)原子引用

原子引用带版本号的原子操作!解决ABA问题,引入原子引用(乐观锁思想)AtomicStampedReference类解决ABA问题packageorg.example.cas;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.atomic.AtomicStampedReference;//使用原子引用解决ABA问题publicclassABADemo{publicstaticvoidmain(String[]args){//默认值默认版本号(时间戳)//如果泛型是一个包装类,注意对象引用的问题//正常在业务中里面比较并

c++ - C++ 中的引用初始化

有人可以向我解释为什么这两个陈述之间存在差异吗?classA{};constA&a=A();//correctA&b=A();//wrong它说从类型A的临时类型A&的非常量引用的无效初始化为什么const在这里很重要? 最佳答案 非常量引用必须用左值初始化。如果您可以用临时变量初始化它们,那么下面的代码会做什么?int&foo=5;foo=6;//?!const引用具有特殊属性,它们可以延长裁判的生命周期,并且由于它们是const,因此您不可能尝试修改某些内容那不在内存中。例如:constint&foo=5;foo=6;//not

c++ - 是否有必要通过常量引用传递迭代器

classT{unordered_maptable;...voidupdateA(constunordered_map::iterator&iter){iter->second=100;}voidupdateB(unordered_map::iteratoriter){iter->second=100;}};问题>哪个函数更好(即updateS或update)?如果你有更好的,请提出。谢谢 最佳答案 1)首先,回答标题中的问题,是否有必要通过(const)引用传递迭代器:否。迭代器充当代理容器中的数据项,无论迭代器本身是否是另一个迭

c++ - 将类型参数传递给自引用指针

templateclassNode{private:Tm_value;//Node*m_ptr;//(1)//Node*m_ptr;//(2)};谁能解释一下上面两种说法(1)和(2)的区别是什么?这两个语句似乎都可以编译,但我似乎无法找到ISOC++对它们的说明。 最佳答案 它们是同一件事,因为您在模板中声明了指针,因此当您创建Node的实例时,编译器知道T是什么。如果可以推导出模板,则不必指定模板的类型,例如来自参数类型,或者在本例中来自指针所属的模板实例。templateclassNode{public:Tm_value;No

c++ - vector 迭代器不可解引用

我有一个名为Shape的抽象基类,Circle和Rectangle都派生自该基类,但是当我在VS2005中执行以下代码时,出现调试断言失败的错误。同时我没有在任何类中重载==运算符Expression:Vectoriteratornotdereferencable,这是什么原因。vectors1;s1.push_back(newCircle(point(1,2),3));s1.push_back(newCircle(point(4,3),5));s1.push_back(newRectangle(point(1,1),4,5));vectors2(s1);reverse(s1.begi