草庐IT

弱引用

全部标签

c++ map/set 迭代器不可取消引用

我想向您请教,因为我是初学者,在互联网上找不到合适的答案。我收到此错误:调试断言失败-映射/设置迭代器不可取消引用在看起来像这样的行:pointA=active->pointNext(timeNext);使用pointNext()函数,我看到一切正常,并且关注active,我有:active=setS.data.end();更多信息:active是multiset::const_iteratorsetS有:setS.Q、setS.W、setS.T和setS.data,其中setS.data在方括号内有0。当我在.cpp文件中有多重迭代器声明时,在调试期间我无法进入以查看事件内部的内容,

c++ - 从 const 引用 move 构造

我有以下情况需要从t1move构造t2。不幸的是,这是不可能的(我想是违反常量的)从foo的调用者透明地处理该问题的正确方法是什么?(即不需要按值传递和显式std::move)structT{T()=default;~T()=default;T(T&&)=default;};Tfoo(constT&t){Tt3;if(predicate)returnt3;elsereturnstd::move(t);}intmain(){Tt1;Tt2=foo(t1);return0;} 最佳答案 Whatistherightapproachtoh

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++ - 如何引用与 C++ 中的局部变量同名的全局变量?

如果有一个全局变量并且函数有一个同名参数,并且期望的结果是局部变量和全局变量的总和,那么在这种特定情况下我们如何引用全局函数?我知道这样做不是个好主意。但只是出于好奇。intfoo=100;intbar(intfoo){intsum=foo+foo;//sumaddslocalvariableandaglobalvariablereturnsum;}intmain(){intresult=bar(12);return0;} 最佳答案 目前最好的选择是重命名函数参数,使其不与全局变量冲突,因此无需规避。假设重命名选项NotAccept

c++ - 防止 const 类函数在引用成员上调用非 const 类函数

对不起,标题有点晦涩,但它确实说明了一切。这就是我的意思classA{voidDoSomething();//non-const}ClassB{public:B(A&a):_a(a){}//constfunctionvoidDoSomethingElse()const{//Isthereawaytodisallowthis?_a.DoSomething();}voidDoEvenMore(){//ShouldbeOK_a.DoSomething();}private://Can'tmakeitconstA&becauseitneeds//benon-constfornon-constf

c++ - 为什么 C++ 不允许重新绑定(bind)引用?

重新绑定(bind)引用有问题吗?我在谷歌上搜索了这个问题,但找不到这个问题的相关答案。是什么让C++的设计者决定这样做? 最佳答案 Stroustrup的TheDesign&EvolutionofC++回答大多数此类问题。在这种情况下,请参阅§3.7引用部分:IhadinthepastbeenbittenbyAlgol68referenceswherer1=r2caneitherassignthroughr1totheobjectreferredtoorassignanewreferencevaluetor1(re-binding

c++ - 为什么这两个右值引用示例具有不同的行为?

第一个例子inta=0;auto&&b=++a;++a;cout打印22第二个例子inta=0;auto&&b=a++;++a;cout打印20问题:为什么在第一个例子中第3行的++a也递增b,为什么在第二个例子中没有这样的行为?更新:Newquestion出现了。 最佳答案 因为pre-increment(++a)先自增a的值,存储结果,然后返回对的引用一个。现在a和b实际上指向同一个对象。后自增(a++),但是先把a的当前值存入一个临时的,自增a,然后返回thistemporary-你的右值ref指向的。a和b指向不同的对象,更

c++ - 有两个具有不同值的指针引用同一个对象是未定义的行为吗?

注意:如果在读完这个问题后您认为“这怎么可能发生”,那没关系。如果您想保持开放的心态,您可以遵循问题后的一些要点,这些要点说明了这是如何发生的以及为什么这样做有用。请记住,这只是一个问题,而不是关于这些主题的教程。这些评论已经有足够的噪音,而且很难跟上。如果您对这些主题有疑问,请将它们作为问题发布在SO而不是评论中,我将不胜感激。问题:如果我有一个int类型的对象存储在c指向的地址int*c=/*allocateint(returnsuniqueaddress)*/;*c=3;由两个指针a和b引用:int*a=/*createpointerto(*c)*/;int*b=/*create

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()作为左值? 最佳

c++ - 在初始化列表中初始化引用

我被告知必须在初始化列表中初始化引用变量,但为什么这是错误的?classFoo{public:Foo():x(0){y=1;}private:int&x;inty;};因为0是一个临时对象?如果可以,引用可以绑定(bind)什么样的对象?可以带地址的对象?谢谢! 最佳答案 0不是左值,而是右值。您无法修改它,但您正在尝试绑定(bind)到可以修改它的引用。如果您将引用设置为const,它将按预期工作。考虑一下:int&x=0;x=1;//wtf:(这显然是不行的。但是const&可以绑定(bind)到临时值(右值):constint