草庐IT

弱引用

全部标签

c++ - 通过引用 const char* 传递字符串文字无法使用 g++ 4.6.3 进行编译

这是来自C++Primer,第4版,第16章的示例,它是关于模板特化的。templateintcompare(constT&v1,constT&v2){if(v1intcompare(constchar*const&v1,constchar*const&v2){returnstrcmp(v1,v2);}intmain(intargc,constchar*argv[]){cout我预计compare("abc","defg")将调用模板的专用版本。但事实是,g++4.6.3不会编译此代码并给出以下错误:error:nomatchingfunctionforcallto'compare(c

c++ - 什么时候在函数中对 const 值使用 const 引用?

在64位系统上,const&是8个字节。对于小于8字节的值和对象,按值传递比按引用传递更有意义。即使是一个8字节的对象,复制也比传递引用然后访问该对象的成本更低。在什么阈值下您应该更喜欢const引用而不是const值? 最佳答案 Forvaluesandobjectssmallerthan8bytes,itmakessensetopassbyvalueratherthanreference.Evenan8byteobjectischeapertocopythantopassthereference,thenaccesstheobj

c++ - 当 C++ lambda 表达式有很多引用捕获时,未命名函数对象的大小变大

以下代码:intmain(){inta,b,c,d,e,f,g;autofunc=[&](){cout使用g++4.8.2编译输出56由于所有局部变量都存储在同一个栈帧中,记住一个指针就足以定位所有局部变量的地址。为什么lambda表达式构造了这么大的未命名函数对象? 最佳答案 我不明白为什么你看起来很惊讶。C++标准给出了一套要求,每一个实现都可以自由选择满足要求的策略。为什么实现会优化lambda对象的大小?具体来说,您是否意识到如何将此lambda的生成代码绑定(bind)到周围函数的生成代码?很容易说嘿!这可以优化!,但实际

c++ - 为什么 C++ 没有 const 通用引用?

斯科特迈耶斯says(对于函数模板的参数):Universalreferencescanonlyoccurintheform"T&&"!Eventhesimpleadditionofaconstqualifierisenoughtodisabletheinterpretationof"&&"asauniversalreference.为什么C++没有const通用引用?任何技术原因? 最佳答案 const通用引用是什么?这将是一个无法修改的引用。从右值引用移动是一种修改。因此,如果存在const通用引用这样的东西,它就是constT

c++ - 取消引用一个指针,然后获取取消引用的地址

我读过STL,指针的用法让我很困惑。destroy(&*first);first是一个指针,那么“&*first”就等于first,为什么不直接用first呢?destroy声明如下:voiddestroy(T*pointer)T是模板参数。 最佳答案 这很可能是由于运算符重载造成的。first是通常赋予迭代器的名称,它重载operator*以返回对指向容器元素的引用,然后使用operator&获取迭代器指向的变量的地址。您可以阅读有关迭代器的更多信息here.但是,如果first是一个指针而不是用户定义的迭代器,那么是的,您可以直

c++ - std::begin 和 std::end 不能使用指针和引用,为什么?

为什么std::begin()和std::end()使用数组而不是指针[这几乎是数组]和数组的引用[这是原始数组的别名]。挠头15分钟后,我无法在谷歌中得到任何东西。下面只有第一种情况有效,第二种和第三种情况无效,这可能是什么原因?#include#include#include#includeintmain(){intfirst[]={5,10,15};//FistCaseif(std::find(std::begin(first),std::end(first),5)!=std::end(first)){std::cout错误:error:nomatchingfunctionfor

c++ - 动态转换引用和自动

我在使用auto和dynamic_cast时遇到了一个非常奇怪的行为。这是我的类层次结构:classBaseInterface{public:virtualvoidsomeMethod()=0;};classDerived:publicBaseInterface{public:virtualvoidsomeMethod1()=0;voidsomeMethod()override;};当然还有一些实现所有派生方法的类。然后是第三个类,如下所示:classThirdClass{public:voiddemoMethod(BaseInterface&);voidanotherMethod(D

c++ - 这个带有空捕获列表的 lambda 如何能够引用到达范围名称?

在C++14标准§5.1.2/12中,它显示了一个lambda表达式的示例,该表达式显然似乎能够引用到达范围的变量x,即使:捕获列表为空,即没有捕获默认值评论说它“不捕获x”例子如下:voidf(int,constint(&)[2]={}){}//#1voidtest(){constintx=17;autog=[](autoa){f(x);//OK:calls#1,doesnotcapturex};}看到它doescompile.它似乎取决于x是const;如果const被移除,它就不会再像预期的那样编译(捕获列表是空的)。即使我将参数设为int以使其不再是通用lambda,也会发生这

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