草庐IT

弱引用

全部标签

c++ - 如何创建对对象的常量引用?

我的设计包含3个类作为我的数据结构。我们将类称为A、B和C。在解析我的输入时,我必须实例化A、B和C的对象。C类的每个对象都需要跟踪A和B类中的相应对象。我当前的实现如下所示:classC{private:A*a;B*b;public:voidsetA(A*a);voidsetB(B*b);}当我使用new创建A和B的对象时,我分配了a和b运算符。问题是我不希望类C的对象能够修改a和b。其实我只需要知道哪个a和b对应一个具体的c即可。一种解决方案是将a和b定义为const指针/对象引用。但是,在对象引用的情况下,我需要在声明它们后立即定义它们。问题是我正在解析多个文件,并且在定义它们时

c++ - 在这种情况下返回引用是好的风格吗?

我偶然发现了EvanTeran在SplitastringinC++?上的回答,其中他通过引用获取一个vector,修改它并返回它的引用。std::vector&split(conststd::string&s,chardelim,std::vector&elems){std::stringstreamss(s);std::stringitem;while(std::getline(ss,item,delim)){elems.push_back(item);}returnelems;}这种风格好吗?我看到优点是直接使用结果,比如std::vectorvec;unsignedintuiSi

c++ - Visual C++ 编译器为不明确的符号提供了错误的行引用

代码如下:namespacen1{templatevoidn2();templatevoidn2(T);}namespacen2/*line12*/{classc{};}usingnamespacen1;namespacen3{voidfoo(n2::c);}voidn3::foo(n2::c)/*line24*/{}尝试使用最新版本的VisualC++编译它时出现以下错误:1>test.cpp(24):errorC2872:'n2':ambiguoussymbol1>test.cpp(12):note:couldbe'n2'1>test.cpp(24):note:or'n2'第12行

c++ - 如何将 Visual Studio 中的“查找所有引用”仅限于相关变量

对于C++文件,为什么右键单击变量用法的“查找所有引用”选项会返回整个项目中的所有拼写用法,无论是否相关。这个Find操作如何仅限于实际相关的变量? 最佳答案 至于MSVC2015Update2,它确实找到了对变量的所有引用,包括注释和字符串。当您获得引用列表时,您可以看到每个元素的不同图标表示不同类型的引用:例如具有相同名称的注释、字符串或变量。浏览列表时,您有两个选择:访问所有找到的位置(F4、Shift+F4)或使用黑色箭头按钮仅访问确认的引用,如下所示:如果搜索无法正常工作,我还建议重新扫描解决方案(解决方案资源管理器>右键

c++ - 尾随返回类型、declval 和引用限定符 : can they work together?

考虑以下示例:#includestructA{voidf(){}};structB{voidf()&{}};structC{voidf()&&{}};templateautof()->decltype(std::declval().f()){}intmain(){f();//f();//(*)f();}当用B调用时(第(*)行),代码不再编译std::declval转换T在特定情况下为右值引用类型。如果我们稍微改变一下,就会遇到相反的问题://...templateautof()->decltype(std::declval().f()){}//...intmain(){f();f()

c++ - 引用函数按值返回和自动

根据我的理解,当您将变量定义为对按值返回的函数的引用时,您实际上拥有对生命周期绑定(bind)到该引用的临时对象的引用,并且您必须将该引用声明为常量。话虽这么说,为什么不将临时定义为const,以便下面示例中的a2自动成为const?如果不允许将非常量引用绑定(bind)到该临时对象,那么为什么不默认使临时对象本身const呢?保持它非常量的原因是什么?#includestd::stringgetStringA(){std::stringmyString="SomeString";returnmyString;}conststd::stringgetStringB(){std::str

c++ - 通过对其基类的引用移动对象后,对象的状态是什么?

假设,有两个类的层次结构:classBase{};classFoo:publicBase{};像这样使用:Foofoo;Base&base=foo;Basemoved=std::move(base);在这样的移动之后foo处于什么状态?标准是否对此类代码有任何限制要求? 最佳答案 标准没有对不属于标准库的C++类的移动构造函数提出任何此类要求。图书馆作家可以自由地做他们想做的事。对于作为标准库一部分的组件,C++17标准确实说明了一些事情(强调我的)§20.5.5.15库类型的移出状态[lib.types.movedfrom]Obj

c++ - 私有(private)继承,返回对基类静态成员的引用

我有一个简单的问题,关于从一个私有(private)继承基类的类继承,即我们有classBase{};classHeir:privateBase{};classHeirsHeir:publicHeir{};了解HeirsHeir无法访问“其”Base的任何内容。特别是,它不能有返回对自身的Base&引用的方法。但为什么它不能返回对另一个Base对象的引用?那么为什么下面的代码不能编译:classBase{};classKid:privateBase{};Baseinstance;classGrandkid:publicKid{constBase&GetInstance()const{r

c++ - std::allocate_shared,允许从自定义分配器和单次分配中分配共享指针引用计数

Makeshared使用引用计数和对象的单一分配提高性能,是否可以将自定义分配器与std::allocate_shared一起使用并且仍然有一个分配,根据我写的测试代码它没有发生:sample我知道boost::intrusive,但它有额外的代码需要编写并且可能出错 最佳答案 在一些调试的帮助下发现std::allocate_shared做了预期的事情,它允许你只为你的对象和引用计数器进行一次分配。下面是更正后的代码:allocateshared此处operatornew对std::make_shared和std::allocat

c++ - 类模板,在定义中引用它自己的类型

我想知道关于标准的以下情况,visualstudio2017和GCC哪个是正确的。问题是在类模板second中,visualstudio中的标识符“second”总是指具体类型,但在gcc中它似乎是上下文相关的。GCC示例templatestructtype_list{};templatetypenametmpl>structtmpl_c{templateusingtype=tmpl;};templatestructtemplate_of;templatetypenametmpl,typename...Ts>structtemplate_of>{usingtype=tmpl_c;};t