草庐IT

弱引用

全部标签

c++ - 如果左值不再用于其定义范围,编译器是否允许将左值转换为右值引用?

考虑以下几点:ComplexObjectfoo(){ComplexObjecttemp;//DothingswithtempComplexObjectresult(temp,SOME_OTHER_SETTING);//1//Dothingswithresult.Donotusetempatallreturnresult;//2}ComplexObjectfoo(){ComplexObjecttemp;//DothingswithtempComplexObjectresult(std::move(temp),SOME_OTHER_SETTING);//1//Dothingswithres

c++ - 类引用成员指向同一类中的其他成员

我正在制作一个涉及3-D坐标的库,发现3-D角度的分量有两个名称:yaw-pitch-roll和heading-elevation-bank所以我做了以下(在c++11中完成):structAngle{floatheading;floatelevation;floatbank;float&yaw=heading;float&pitch=elevation;float&roll=bank;//SomeConstructors(copyandassignmenthavetobemademanually)}这有利于保持两个名称方案之间的表示法相同。例如:Angleangle;rotate(a

c++ - 如何声明自引用模板类型

我的情况就像这个人为的例子:templatestructController{};templatestructFeature{typedefFeatureFeatureType;};typedefControllerDefaultController;Controller被模板化以接受特性,我的问题是一些特性需要Controller的类型作为模板参数。这使得示例最后一行的typedef无法编译。这是可能的还是我需要重新考虑设计? 最佳答案 为了完成这个你应该做一些元编程魔术(相信我这不是一件容易的事)。但是如果你真的需要它并且使用b

c# - 将具有 C++ 引用成员的 C# 类编码

我们的任务是将一个类与另一个类的引用从C#传递到C++。C#类如下所示:[StructLayout(LayoutKind.Sequential,Pack=1)]publicclassImageInfo{publicuintWidth;publicuintHeight;publicuintStride;}[StructLayout(LayoutKind.Sequential,Pack=1)]internalclassFrameInfo{publicintFrameNumber;publicdoubleTimeStamp;publicImageInfoImage;//Thisisthepr

c++ - 防止对 std::unique_ptr 的不安全取消引用

摘自cppcon2015的幻灯片:unique_ptrf(){autoa=make_unique();returna;}//Whydoesthisevencompile?constA&dangling=*f();//BOOM!!!use(dangling);我的问题是:对于*this的右值引用,这可以解决吗?我在cppreference的规范中看到:typenamestd::add_lvalue_reference::typeoperator*()const;问题:不允许operator*用于右值unique_ptr并且只对左值unique_ptr取消引用有效吗?仍然有有效的用例来保持

c++ - 使用 std::weak_ptr 和别名构造函数打破循环引用:听起来还是有问题?

我还没有在任何主要的C++论坛/博客(例如GotW)上找到以下打破循环引用的方法,所以我想问一下该技术是否已知,其优缺点是什么?classNode:publicstd::enable_shared_from_this{public:std::shared_ptrgetParent(){returnparent.lock();}//thegetterfunctionsensurethat"parent"alwaysstaysalive!std::shared_ptrgetLeft(){returnstd::shared_ptr(shared_from_this(),left.get())

c++ - Clion 未定义函数引用

这个问题在这里已经有了答案:Whatisanundefinedreference/unresolvedexternalsymbolerrorandhowdoIfixit?(38个答案)关闭5年前。我有一个简单的程序,包含main.cpp、头文件func.h和另一个源文件func.cpp。我使用CLion2016.3。我的编译器是gcc。它们看起来像这样:main.cpp#include#include#include#include"func.h"intmain(){intc;c=number(2);printf("%i",c);}函数.cppintnumber(inta){retur

c++ - 为什么我们必须在复制构造函数的参数中使用引用而不是指针?

为什么我们必须在复制构造函数的参数中使用引用而不是指针?这个问题是在采访中被问到的。我回复了以下几点:引用不能为NULL。如果我们使用指针,那么它就不是拷贝构造函数。标准规定如此(第12.8.2节)。但是面试官并不满意。他说这“与继承和虚函数有关”。我需要帮助或一些相关要点,以便我能够在那个方向上想到答案。 最佳答案 你的观点看起来很合理,我不知道你的面试官想听你说什么。但是,据我所知,为复制构造函数和赋值运算符启用统一语法是Stroustrup引入引用的一个重要原因。例如,假设我们在C++中没有引用,我们想做一些复制构造,通过指针

c++ - 转发模板参数的常量性,我应该使用转发引用吗?

我想编写一个函数foo,它应该调用其参数的operator(),如下面的(损坏的)代码所示:templatevoidfoo(constT&x){x();}structMyFunctor{intdata;voidoperator()(){/*stuffthatmightmodifythedata*/}};intmain(){foo(MyFunctor{});}显然代码不起作用,因为operator()是非const,但是foo()要求它的参数是常量。作为模板函数,foo()应该与const和非const仿函数一起工作,并且对不挑剔code>const-它的参数。如果我通过将const更改

c++ - 防止通过引用传递右值

在我的项目中,大多数对象都是在arena中创建的,并且保证它们在用户session期间存在。所以对于某些类来说,将const引用作为成员字段是非常安全的,例如:classA{public:A(conststring&str):str_(str){}private:conststring&str_;};但是这里有一个陷阱。可能会错误地通过以下方式创建A的实例:Aa("sometemporalstringobject");在该行中,时间string对象已被隐式创建和销毁。所以在那之后a存储了不正确的引用。如何防止这种行为?要是编译出错就更好了... 最佳答案