草庐IT

c++ - 函数模板不识别左值

我的代码有问题这是它的简化版本:#includeclassA{public:templatevoidfunc(T&&)//acceptrvalue{std::coutvoidfunc(constT&)//acceptlvalue{std::cout我希望输出是:inlvalueinrvalue不过是inrvalueinrvalue为什么?! 最佳答案 templatevoidfunc(T&&)是通用引用转发引用。要测试您想要的,请尝试:(Liveexample)templateclassA{public:voidfunc(T&&)/

c++ - 那么 "this"的类型是什么?为什么 "this"不是左值?

假设对象是classA{public:voidSilly(){this=0x12341234;}我知道我会得到编译器错误““this”不是左值。”但那也不是暂时的。那么“this”的假设声明是什么?编译器:Mac上的GCC4.2编译器。 最佳答案 对于某些X类,this类型为X*this;,但你不允许分配给它,所以即使它实际上没有类型X*constthis,就阻止分配而言,它的行为几乎就像它一样。正式地,它是prvalue,这与类似整数文字的类别相同,因此尝试分配给它大致等同于尝试为'a'分配不同的值。或10.请注意,在早期C++中

c++ - 左值参数是否更喜欢左值引用参数而不是通用引用?

在使用通用引用时,我遇到了clang和gcc不同意重载解决方案的情况。#includestructfoo{};templatevoidbar(T&){std::coutvoidbar(T&&){std::coutgccreports上面的调用是模棱两可的。然而,clang选择T&重载并成功编译。哪个编译器出错了,为什么?编辑:在VS2013Preview上测试了相同的代码,它与clang一致;除了Intellisense,它在gcc方面:-) 最佳答案 “通用引用”将参数推导为foo&。第一个模板还将参数推导为foo&。C++对函数

c++ - 模板中右值引用和 const 左值引用之间的重载

我想根据参数是否为临时对象来重载两个函数,所以我这样写代码:#includevoidf(int&&){std::cout它正确地输出:const&&&但是,当我更改代码以使用这样的模板时:#includetemplatevoidf(T&&){std::coutvoidf(constT&){std::cout输出变为:&&&&有什么问题?使用模板时如何针对可移动的临时对象进行优化?编辑:其实这是我看C++Primer时的测试代码。它说:templatevoidf(T&&);//bindstononconstrvaluestemplatevoidf(constT&);//lvaluesan

c++ - 左值初始化失败

“TheC++ProgrammingLanguage4thEdition”中的一些示例代码让我感到困惑。这是我的测试用例。Envgcc版本4.6.3(Debian4.6.3-14+rpi1)with-std=c++0x代码1stringvar{"Cambridge"};string&r1{var};编译失败代码2stringvar{"Cambridge"};string&r1=var;编译成功代码3stringvar{"Cambridge"};string&&r1{var};编译成功Code1编译失败g++-g-DLINUX-std=c++0x-csrc/dummy.cpp-osrc/

c++ - 在 C++14 中不指定对象的左值

我在这里使用N3936作为引用(如果任何C++14文本不同,请更正此问题)。在3.10左值和右值下,我们有:Everyexpressionbelongstoexactlyoneofthefundamentalclassificationsinthistaxonomy:lvalue,xvalue,orprvalue.但是lvalue的定义是:Anlvalue[...]designatesafunctionoranobject.在4.1Lvalue-to-rvalueconversion中,文本出现:[...]Inallothercases,theresultoftheconversion

c++ - 左值何时在 C++ 中 move 而不是复制?

鉴于以下情况:FoogetFoo(){Fooresult=doSomeWork();returnresult;}C++是否保证result会被move,而不是被复制?或者换句话说,编写returnstd::move(result)是多余的吗?在没有显式std::move强制转换的情况下,是否有任何(其他)标准规定将静默move而不是复制左值的情况?注意事项:假设Foo是可move构造的。忽略复制/move省略,这可能另外适用。 最佳答案 尽管move可能会被省略,但是是的。如果move构造函数可用,则永远不会发生复制。为了清楚起见,

c++ - 如何有效地将左值或右值绑定(bind)到同一个引用?

假设您有一个C++函数,它使用了(常量)参数的更改版本。MyObjectalter_obj(MyObjectconst&obj);//Createsnew,alteredobjectvoidfunc(MyObjectconst&original){MyObjectconst&altered(alter_obj(original));//...}由于“最重要的常量”导致临时对象的生命周期延长,因此可以正常工作。如果alter_obj()满足返回值优化的要求,它也相当有效,因为RVO意味着不会不必要地复制值返回的更改对象。如果您根本不进行更改,它也会很有效:voidfunc(MyObjec

c++ - 关于左值到右值的转换,什么时候需要?

我在网上看了很多,好像很多人都提到了下面的规则(但我在标准中找不到),加法运算符+(以及所有其他二元运算符)要求两个操作数都是右值,结果也是右值。等等..我查看了C++标准,它明确指出(条款3.10/2),Wheneveraglvalueappearsinacontextwhereaprvalueisexpected,theglvalueisconvertedtoaprvalue(第5/9条),Wheneveraglvalueexpressionappearsasanoperandofanoperatorthatexpectsaprvalueforthatoperand,thelval

c++ - 在 C++ 11 中将非常量左值引用绑定(bind)到右值是否有效?(已修改)

我知道在c++03中,非常量引用不能绑定(bind)到右值。T&t=getT();无效,在c++11中,我们可以这样做:T&&t=getT();但是上面的代码,应该在c++11中工作吗?我用vs11测试了下面的代码:FoogetFoo(){returnFoo();}voidfz(Foo&f){}intgetInt(){returnint();}voidiz(int&i){}intmain(){{Foo&z=getFoo();//okfz(getFoo());//okint&z2=getInt();//error:initialvalueofreferencetonon-constmus