草庐IT

弱引用

全部标签

c++ - 如何在 C++ 中创建带有引用成员的数组?

我有一些类Foo和Logger:classLogger{/*somethinggoeshere*/};classFoo{Foo(Logger&logger);Logger&logger;}Foo::Foo(Logger&logger):logger(logger){}现在我想创建一个Foo类对象数组,其中所有引用Foo::logger都应该指向同一个Logger对象。我尝试了类似的方法(我需要堆栈和堆分配):Loggerlog(/*parameters*/);Fooobjects[3](log);//OnstackFoo*pObjects=newFoo[3](log);//Onheap

C++11 lambda 捕获列表 [=] 使用引用

当我捕获一个值但该值类型是模板函数中的引用时templatevoidtest(T&&i){++i;std::coutvoidtypetest(T&&t){++t;Tt1(t);[=]()mutable{std::cout它打印232但是在Tt1(t);T是int&所以t1应该是int&当lambda调用test(t1)时。为什么输出不是233 最佳答案 Tisint&sot1shouldbeint&引用不是指针。T可以推导为int&,因此t1是一个引用。但是您要求lambda按值捕获t1。这意味着复制t1引用的值。如果t1是一个指针

c++ - C++ 中的链表使用引用而不是指针

假设我想创建一个不可修改的链表(即它只能被遍历,一旦最初创建就不能添加或删除任何节点)。这可以通过以下方式轻松实现:structListNode{intvalue;ListNode*nextNode;}我的问题是......是否可以使用引用而不是指针?structListNodeWithRefs{intvalue;ListNodeWithRefs&nextNode;}我不确定它是否会带来任何性能提升,但是......这个问题在编码时突然出现,目前我的回答是否,但我可能会遗漏一些东西。原则上,没有什么能阻止您像这样使用引用和构造列表元素:ListNodeWithRefs::ListNod

c++ - 调用左值引用构造函数而不是右值引用构造函数

有这段代码:#includeclassF{public:F()=default;F(F&&){std::cout输出是:F(F&)G()为什么在G类的构造函数中调用F(F&)构造函数而不是调用F(F&&)构造函数?G类的构造函数的参数是F&&f,它是右值引用,但调用了左值引用的构造函数。 最佳答案 WhyF(F&)constructoriscalledinsteadofF(F&&)constructorinconstructorofclassG?因为f是一个左值。即使它绑定(bind)到一个右值,并且它的类型是对F的右值引用,它也是

c++ - 在 C 中通过 const 引用传递

C是否像C++一样支持通过const引用传递?如果不是,是否有其他方法可以使按值传递更有效?我认为仅仅因为效率更高就传递对函数的引用是没有意义的。 最佳答案 C不支持引用或通过引用传递。您应该改用指针并按地址传递。按值传递对于原始类型是有效的,但对于结构来说是浅拷贝。在C++中,通过引用传递对象以提高效率非常有意义。当定义复制构造函数时,它可以节省大量的构造函数/析构函数的复制和调用。对于大型数据对象(例如std::list),按值传递是不切实际的,因为传递时会复制列表。在这里你绝对应该通过引用传递。

c++ - 为什么不总是在 C++ 中通过 const 引用传递?

我知道当您想更改原始变量的值时,您会通过引用传递给C++中的函数。但是当您希望程序更高效并且不想更改传递给函数的变量中的任何内容时,您也可以通过引用传递,只需将其设为常量即可。我的问题是,为什么不总是让你的函数接受通过const引用传递的变量,如果它比仅仅传递变量并让编译器在函数范围内创建一个新变量更有效的话?要扩展这个问题,函数需要复制通过参数传递的变量的情况是什么? 最佳答案 当参数按值传递时,它是可修改的并且可以省略复制它。例如,实现赋值运算符的规范方式如下所示:T&T::operator=(Tvalue){value.swa

c++ - 如何在模板中存储右值或左值引用

我正在尝试创建一个简单的模板enumerator类,它应该接受定义了:运算符的任何对象,然后打印(i,v[i]).一个简单的实现如下:templatestructenumerator{T&v;//referencetominimizecopyingenumerator(T&_v):v(_v){}voiddo_enumerate(){size_ti=0;for(autox:v){cout这适用于以下情况:案例Avectorv({1,2,6,2,4});autoe=enumerator(v);e.do_enumerate();但是,我也希望它能处理临时对象,例如:案例Bautoe=enum

c++ - 通过引用重载运算符传递对象 - C++

对C++很陌生。我看到人们通常在运算符重载中通过引用传递对象。好吧,我不知道什么时候真的有必要。如下面的代码所示,如​​果我在operator+中删除对象c1和c2的声明中的符号,我仍然会得到相同的结果。当我们不想修改c1或c2时,在这种情况下是否有任何理由按引用传递?#includeclassKeys{private:intm_nKeys;public:Keys(intnKeys){m_nKeys=nKeys;}friendKeysoperator+(constKeys&c1,constKeys&c2);intGetKeys(){returnm_nKeys;}};Keysoperat

c++ - 在 C++11 循环范围内使用对指针的引用作为序列

以下两段代码之间的唯一区别是引用的使用。我理解为什么第一个代码片段无法编译,并且正在寻求帮助以了解为什么第二个代码片段可以编译。第一个片段:inta[2][3]={0,1,2,3,4,5};for(autorow:a)for(autocolumn:row)cout上面的代码无法通过编译,因为'row'的类型是指向int的指针,这不是一个序列。第二个片段:inta[2][3]={0,1,2,3,4,5};for(auto&row:a)for(autocolumn:row)cout此代码编译。如果我正确理解auto的工作原理,“行”是对指向int的指针的引用。但是为什么这个引用可以被看作一

c++ - 具有模板化类的通用引用

例子:templateclassBar{public:voidfoo(T&&arg){std::forward(arg);}};Barbar;bar.foo(10);//worksinta{10};bar.foo(a);//errorC2664:cannotconvertargument1from'int'to'int&&'似乎通用引用仅适用于模板函数并且仅适用于类型推导,对吧?所以在类里面使用它没有意义吗?在我的情况下使用std::forward是否有意义? 最佳答案 请注意,首选术语(即将出现在规范的future版本中的术语)现