草庐IT

弱引用

全部标签

c++ - 为什么指向函数的指针不能绑定(bind)到左值引用,而函数可以?

使用带和不带符号的函数名有什么区别?我注意到它们在绑定(bind)到模板参数时以不同的方式表现:voidfoo();templatevoidbind(F&);bind(foo);//OKbind(&foo);//Error为什么会这样?这些情况下的推导类型是什么? 最佳答案 注意内置的operator&将返回T*类型的prvalue。所以&foo将返回一个类型为void(*)()的函数指针,它是一个纯右值,不能绑定(bind)到非常量的左值引用;这正是bind()期望的参数,然后它失败了。对于bind(foo),templatepa

c++ - 左值引用和右值引用中的绑定(bind)错误

voidf(int&i){cout假设上面的代码,我们有一个重载函数,它分别接受l-value-reference和r-value-reference参数。intx=5;f(x);f(5);constintj=9;f(j);当我使用constintj=9时,编译器给出了歧义错误。我怎么解决这个问题? 最佳答案 您的编译器错误(如果确实是您提到的错误)具有误导性。这里真正错误的是,尝试将constint参数传递给您的任何函数都会丢弃const限定符,这是不允许的。您可以通过将签名更改为constint&/constint&&来解决它(

c++ - 当左值引用参数和右值引用参数作为相同的转发引用类型传递时,为什么它不起作用?

#includetemplatevoidf(T&&a,T&&b){}intmain(){intn;f(n,std::move(n));}T&&是转发引用类型,所以我觉得decltype(a)应该是int&和decltype(b)应该是int&&。但是,上面的代码会产生以下错误:main.cpp(13,2):error:nomatchingfunctionforcallto'f'f(n,std::move(n));main.cpp(7,6):note:candidatetemplateignored:deducedconflictingtypesforparameter'T'('int&

如果值来自成员变量,则C++复制初始化和const引用初始化之间的区别

考虑以下几点:#includeusingnamespacestd;classMyClass{public:MyClass(stringmyMemberInitValue);conststringgetMyMember1();private:stringmyMember;};MyClass::MyClass(stringmyMemberInitValue):myMember(myMemberInitValue){}conststringMyClass::getMyMember1(){returnmyMember;}intmain(){MyClassmyObj("HelloWorld");

c++ - lambda 表达式中引用捕获和非显式捕获的 constexpr 变量之间的区别

这个问题Accesstoconstexprvariableinsidelambdaexpressionwithoutcapturing回答了为什么下面示例中的ref-capture不是严格必要的。但另一方面,如果它被捕获,则会出现错误。错误似乎是由foo()的递归性质触发的。templateconstexprintbar(constT&x){//NOK//constexprintbar(Tx){//OKreturnx;}templateintfoo(constT&l){constexprautox=l()-1;autoy=[&]{returnbar(x);};//ifref-captu

c++ - 为什么作为返回类型的右值引用不能初始化非常量引用?

我读了this问题,我知道右值引用是左值。然而,对于这段代码,例子1,int&&fun(){return1;}intmain(){int&a=fun();}当我编译它时:error:invalidinitializationofnon-constreferenceoftype'int&'fromanrvalueoftype'int'所以C++编译器告诉我fun的返回类型是右值。右值引用如何变成右值?我认为编译器应该以相同的方式对待左值引用和右值引用,但是这段代码,示例2,int&fun(){intb;returnb;}intmain(){int&a=fun();}可以编译(尽管如此,我

c++ - 通过引用或值传递链表对象更好吗?

假设您只想打印出列表的值-您是按值还是按引用传递对象?如果您只是打印列表,这有关系吗? 最佳答案 视情况而定。通常答案是const&,因为您不希望复制数据的开销。但是IO慢。在足够高级的应用程序中,任何IO都必须以异步方式完成。带有引用的异步代码非常难以正确处理,而且复制数据通常比IO便宜得多。所以答案可能是复制它并在拷贝上执行异步IO。请注意,复制大多数链表比复制连续缓冲区更昂贵;所以你可能会把链表复制到一个不太动态的结构中(比如一个缓冲区或缓冲区链)。在99/100的情况下,您希望完全放弃链表并使用单个缓冲区或缓冲区链,即使在I

c++ - 继承引用无法正常工作

当运行下面的代码时,它涉及通过一个名为B的类的方法更改int的值,该类继承自模板类A,int的值没有改变,我不明白为什么,我已经用clangtrunk和gcctrunk测试了这两个:#includetemplatestructA{A(T&a_num_):a_num(a_num_){}T&a_num;};structB:publicA{templateB(Args...args):A(args...){}voiddo_something(){a_num=1634;}};intmain(void){intnum=4;Bb{num};b.do_something();std::cout我希望

c++ - 为什么不能使用 constexpr 全局变量来初始化 constexpr 引用类型?

#includeusingnamespacestd;constexprintr=100;intmain(){constexprint&k=r;cout编译此代码会在编译时出现“错误:将‘constint’绑定(bind)到‘int&’类型的引用会丢弃限定符”。 最佳答案 编译时在int后加入constconstexprintconst&k=r;//...........^^^^^问题是constepxr隐含了const,所以当你定义rconstexprintr=100;您将constexpr定义为intconst值(还要考虑cons

c++ - 为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级?

C++中指向成员解引用运算符(.*和->*)的指针的运算符优先级为4,而函数调用运算符的优先级为2。这几乎可以保证需要括号:#includestructA{intb;intfunc1(inta){returna+b+1;}intfunc2(inta){return2*a+b;}};intmain(){Aa;a.b=3;int(A::*ptr)(int);ptr=&A::func1;std::cout在我看来,将.*定义为优先级2会(具有从左到右的关联性)否定括号的需要,并且没有明显的不良副作用。选择这个优先级的原因是什么? 最佳答案