我知道我可以这样做来区分右值函数名和左值函数指针:templatevoidtakeFunction(RET_TYPE(&function)(ARGs...)){coutvoidtakeFunction(RET_TYPE(*&function)(ARGs...)){cout而且我希望对成员函数做同样的事情。但是,它似乎没有翻译:structS;voidtakeMemberFunction(void(S::&function)())//errorC2589:'&':illegaltokenonrightsideof'::'{cout为什么?我知道的另一种方法是对常规函数执行此操作:void
structA{};Af1(){returnA();}intf2(){returnint();}intmain(){f1()=A();//OKf2()=int();//errorC2106:'=':leftoperandmustbel-value}为什么f1()=A();正常而f2()=int();失败? 最佳答案 f1()返回A的实例。由于您没有覆盖复制/移动赋值运算符,因此编译器会为您生成一个。您实际上是在调用成员函数:f1()=A();//callsA&operator=(A&&)第二个不起作用,因为int不是类类型。
我正在查看标准5.16第3段,试图了解发生了什么。考虑类型M定义为structM{M();M(constM&);M(M&&);};如果我有一个三元表达式pred?E1:E2,其中E1的类型是constM&,E2的类型是M&&5.16第3段第1点是否适用?—IfE2isanlvalue:E1canbeconvertedtomatchE2ifE1canbeimplicitlyconverted(Clause4)tothetype“lvaluereferencetoT2”,subjecttotheconstraintthatintheconversionthereferencemustbin
int&&rv=10;int&lv=rv;//noerror这怎么可能?这与“引用折叠规则”有关吗? 最佳答案 int&&rv=10;int&lv=rv;//noerror首先,命名对象绝不是右值。其次,由于rv是命名对象,因此它不是右值,即使它绑定(bind)到右值。由于rv是左值,它可以毫无问题地绑定(bind)到左值。请注意,右值特性是表达式的属性,而不是变量。在上面的示例中,右值是从10中创建的,并绑定(bind)到rv,正如我所说,它是左值。 关于c++-将右值引用分配给左值引
我知道可能还有其他类似的问题,但他们没有完全回答我的问题。我一直在浏览有关C++类型推导的讲座中的一些幻灯片,在其中一张中我发现了以下语句:int&foo();//foo()islvalue;起初,我以为这是错误的——foo是一个函数,它不能被赋值,它不是一个左值。但现在我想作者可能有不同的想法。也就是说,函数调用可能是左值,而不是函数本身。换句话说:foo是左值吗?foo()是左值吗?是否可以将函数(不是函数调用)分配给(即foo=something;)?“左值是可以分配给的每个对象/事物”-这个陈述总是正确和准确的吗?问题4需要更多解释。有了它,我试图理解什么是左值。我看到的另一个
使用带和不带符号的函数名有什么区别?我注意到它们在绑定(bind)到模板参数时以不同的方式表现:voidfoo();templatevoidbind(F&);bind(foo);//OKbind(&foo);//Error为什么会这样?这些情况下的推导类型是什么? 最佳答案 注意内置的operator&将返回T*类型的prvalue。所以&foo将返回一个类型为void(*)()的函数指针,它是一个纯右值,不能绑定(bind)到非常量的左值引用;这正是bind()期望的参数,然后它失败了。对于bind(foo),templatepa
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&&来解决它(
#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&
#includeintfoo(){return0;}intmain(){constint&a=foo();std::cout在这段代码中,a绑定(bind)到一个右值。取它的地址合法吗?(我的法律意思是:在代码中格式不正确?我是否导致了未定义的行为?) 最佳答案 这很好。在C++11中,您甚至可以这样做:int&&a=foo();a=123;您可以这样考虑临时对象(概念上和一般情况下):x=func();//translatedas:auto__temporary=func();x=__temporary;__destruct_va
在thisconference,ScottMeyers首先说“左值通常是你可以取地址的表达式”。我一般强调这个词:什么是你不能获取地址的左值?(如果存在的话)。编辑:请提供包含您的答案的代码片段,这会让事情更清楚。 最佳答案 我认为位域满足你的条件...我相信f.x是一个左值,但你不能获取它的地址。有趣的是,您也不能执行auto&x=f.x。C++11Section8.3.1PartofParagraph4:Sincetheaddressofabit-field(9.6)cannotbetaken,apointercanneverp