C++标准草案N4296说[class.temporary/5]Thesecondcontextiswhenareferenceisboundtoatemporary.Thetemporarytowhichthereferenceisboundorthetemporarythatisthecompleteobjectofasubobjecttowhichthereferenceisboundpersistsforthelifetimeofthereferenceexcept...所以我想知道如果两个或多个引用绑定(bind)到一个临时文件会发生什么。它在标准中有具体规定吗?以下代码可能
这是我想做的简化版本。constexprfloatf(floata,floatb){constexprfloattemp=a+b;returntemp*temp*temp;}在我的版本中,a+b是更复杂的东西,所以我不想剪切和粘贴它三次。使用3*(a+b)也不是实际功能的有效解决方案。我试图让问题与语法相关,而不是代数。我可以通过将a+b移动到它自己的constexpr函数来让它工作,但我宁愿不要用其他无用的函数污染命名空间。 最佳答案 正如您所发现的,您不能在constexpr函数体内声明变量,甚至是constexpr变量。通过将
以下部分演示了我的问题:(GCC上的编译错误)stringstreamss;strings;ss我的错误:constSwap.cc:14:error:nomatchingfunctionforcallto'std::basic_string,std::allocator>::swap(std::basic_string,std::allocator>)'basic_string.tcc:496:note:candidatesare:voidstd::basic_string::swap(std::basic_string&)[with_CharT=char,_Traits=std::c
例如这个函数f定义如下:intf(intx){returnx;}如你所知,你不能为这个临时int分配一个引用:int&rf=f(2);//thiswillgiveanerror但是如果我像这样重新定义函数f:int&f(intx){returnx;}f(2);//sonowf(2)isareferenceofx,whichhasbeendestroyed所以我的问题是:编译器怎么能不让你创建一个临时引用,该引用将在声明后被销毁(第一种情况)。另一方面,它允许您创建对x的引用f(2),而编译器知道该引用将在return后被销毁。 最佳答案
#includeusingnamespacestd;classA{intx;public:A(intc):x(c){}A(constA&a){x=a.x;cout在上面的代码中,我预计“调用复制构造函数”消息会弹出两次,因为首先,b.get_A()将创建一个调用复制构造函数(1)的临时对象,其次,它将复制其引用到a1的复制构造函数(2),从而显示两条消息。但是,该代码实际上会产生一条“已调用复制构造函数”消息。为什么? 最佳答案 C++标准允许copyconstructortobeelided在某些情况下。通常,这意味着对象是否将从
在询问时thisquestion,我了解到对临时对象的const引用在C++中是有效的:intmain(){inta=21;intb=21;//error:invalidinitializationofnon-constreference//int&sum=a+b;e[...]//OKintconst&sum=a+b;returnsum;}但在下面的例子中,常量引用refnop指的是一个被销毁的临时对象。我想知道为什么?#include#includestructA{//datastd::mapm;//functionsconstA¬hing()const{return*this
假设我有一个类:classAggregate{public:intx;inty;};我知道如何使用大括号初始化一个对象:Aggregatea1={1500,2900};但是我找不到合适的语法来创建临时对象并将其作为参数传递给某些方法,例如:voidfrobnicate(constAggregate&arg){//dosomething}//...frobnicate(Aggregate{1500,2900});//whatshouldthislinelooklike?最简单的方法是将构造函数添加到Aggregate类,但假设我无权访问Aggregateheader。另一个想法是编写某种
当我尝试在ideone上编译以下内容时:classX{public:friendX&operator+=(X&x,constX&y);};X&operator+=(X&x,constX&y){returnx;}intmain(){X()+=X();}正如预期的那样,这会引发编译错误,因为您不能将临时值传递给非const引用。但是,以下编译成功ideone:std::string()+=std::string();这个错误不应该像我上面的例子那样吗?编辑:如果std::string()将+=定义为成员操作,当这种用法允许左侧是临时的时,为什么要这样做?为什么不像我上面那样定义它并避免提及
这是一个r值实验,但当gcc向我提示缺少移动构造函数(我已将其删除)并且没有回退到复制构造函数(如我所料)时,它发生了变化然后我从标志中删除了-std=c++11并尝试了你在下面看到的内容,它有很多输出(最初没有)因为我试图弄清楚为什么它不起作用(我知道如何调试,但我发现stdout上的消息可以很好地指示正在发生的事情)这是我的代码:#includeclassObject{public:Object(){id=nextId;std::cout输出:Creatingobject:0AoughttoexistIntestCreatingobject:1Test'stmpoughttoexi
如何传递一个临时数组?我想做这样的事情:#includeintsum(intarr[]){intanswer=0;for(constauto&i:arr){answer+=i;}returnanswer;}intmain(){std::cout函数参数的大括号[]中是否需要正整数文字?如果我包含该文字,它是否会限制我只能传递给该大小的数组的数组?另外,如何通过右值引用或const引用传递数组元素?因为上面的示例没有编译,所以我假设函数的参数类型int&&[]或constint&[]将不起作用。 最佳答案 首先,您不能传递数组作为纯右