草庐IT

弱引用

全部标签

c++ - c++ 中的函数引用

任何人都可以详细说明此代码中引用的行为,以及为什么它在第一行打印12而不是11。下面是代码http://ideone.com/l9qaBp#includeusingnamespacestd;int&fun(){staticintx=10;x++;returnx;}intmain(){int*ptr=&fun();int*ptr1=&fun();printf("%p%p\t%d%d",(void*)ptr,(void*)ptr1,*ptr,*ptr1);return0;}代码的输出是1345191321345191321212请解释为什么12在第一次调用时打印而不是11我理解在第二次调用

c++ - 删除右值,保留左值引用(标准类型特征可用?)

我正在尝试编写一个函数,以std::tuple的形式返回可变参数包的子集。理想情况下,该函数应该没有运行时开销(没有不必要的拷贝),并且它应该允许用户访问lvalue引用并修改它们。应维护值类型、lvalue引用和constlvalue引用。临时对象(rvalue引用)应“转换”为值类型以避免创建无效引用(对临时对象的引用)。期望结果示例:intlr=5;constint&clr=lr;autot=make_subpack_tuple(lr,clr,5);static_assert(is_same>{},"");//Ok,modifieslr:std::get(t)=10;//Comp

c++ - catch(...) 中的 throw 是按值还是按引用抛出

我老板回答了这个问题why...(threepoints)incatchblockisexist?非常优雅。但这让我想到了一些事情(并希望弥补我之前的错误问题),确实catch(...){throw;}通过值(即采用深拷贝)或通过引用重新抛出捕获的异常? 最佳答案 标准说:Athrow-expressionwithnooperandrethrowsthecurrentlyhandledexception.Theexceptionisreactivatedwiththeexistingtemporary;nonewtemporarye

c++ - 通过引用传递带有枚举类的枚举

我有thefollowingcode我认为应该编译但没有编译。#includetypedefuint8_ttesttype;enumtestenum:uint8_t{};voidfoo(uint8_t&v){}intmain(){testtypebar;foo(bar);testenumbaz;foo(baz);return0;}我收到以下错误:prog.cpp:15:9:error:invalidinitializationofnon-constreferenceoftype'uint8_t&{akaunsignedchar&}'fromanrvalueoftype'uint8_t{

c++ - std::move 是否与左值引用一起使用? std::move 如何在标准容器上工作?

#includestructA{inta[100];};voidfoo(constA&a){std::vectorvA;vA.push_back(std::move(a));//howdoesmovereallyhappen?}intmain(){Aa;foo(a);}上面的代码编译正常。现在到处都写着move避免复制。以下是我的查询:move在处理左值时真的有效吗[非]-const引用?即使有“右值引用”,对象复制时如何避免复制像上面一样插入标准容器中?例如voidfoo(A&&a){//supposeweinvokethisversionstd::vectorvA;vA.push_

c++ - 在可能的情况下,C++ 是否总是更喜欢右值引用转换运算符而不是 const 左值引用?

在编写转换运算符时,如果我同时提供到constT&和T&&的转换,C++是否会尽可能优先选择右值运算符?在这个小测试中似乎是这样:#include#includestructholds{operatorint&&(){printf("moving!\n");returnstd::move(i);}operatorconstint&()const{printf("copying!\n");returni;}private:inti=0;};intmain(){holdsh;intval=h;}打印:╰─▸./testmoving!但也许有人说的专业知识比我验证的要好?

c++ - C++ 的什么特性允许模板类在没有模板参数的情况下引用它们自己?

给定:templateclassC{C&operator++(){...}};为什么/怎么样C允许声明C类型的变量和函数而不是被要求命名C?在处理包含许多参数的模板之前,我并没有真正考虑过这个问题,因为这会使拼写“self类型”变得不方便。有什么我应该知道的怪癖吗? 最佳答案 [n3290:14.6.1/1]:Likenormal(non-template)classes,classtemplateshaveaninjected-class-name(Clause9).Theinjected-class-namecanbeuseda

c++ - 为什么要对地址运算符和引用声明符共享与符号 (&)?

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。在C++中,&字符(&)可用于获取左值的地址、函数指示符或限定名称。.inty;int*p_to_y=&y;该字符在C++中作为引用声明符共享使用。.inty;int&y_alias=y;在粗略了解C之后学习C++时,这种双重用法让我很困惑!我知道使用符号的上下文会造成所有差异,但鉴于引用和指针是不应混淆的重要概念,任何人都可以提出为什么&被回收而不是使

c++ - 为什么 C++11 标准中的 INVOKE 工具引用数据成员?

标准的$20.8.2描述了INVOKE工具,该工具主要用于描述如何在整个标准库中使用可变参数列表调用可调用对象:DefineINVOKE(f,t1,t2,...,tN)asfollows:—(t1.*f)(t2,...,tN)whenfisapointertoamemberfunctionofaclassTandt1isanobjectoftypeTorareferencetoanobjectoftypeTorareferencetoanobjectofatypederivedfromT;—((*t1).*f)(t2,...,tN)whenfisapointertoamemberfun

C++ 右值引用和 move 语义

所以我昨天在youtube上观看了c++视频,发现了一个关于C++-11右值引用和move语义的视频。我想我从广义上理解了这个概念,但是今天当我和助教一起检查我的代码时,他问我为什么没有在下面的代码中给我们一个引用(比如std::pair&p)。在这种情况下,我根本没有考虑过,但当他问起时,我想起了视频中所说的“在C++-11中,你通常应该使用按值传递。”因此我的问题是:在下面的代码中,std::pairp像std::pair&p一样过得更好或不?是否会使用move语义,它会有所作为吗?IPAddressNameServer::lookup(constHostName&host)con