草庐IT

临时表

全部标签

c++ - 是否可以通过 const 引用获取参数,同时禁止转换以便不传递临时变量?

有时我们喜欢通过引用获取一个大参数,并且如果可能的话还使引用成为const以表明它是一个输入参数。但是通过将引用设置为const,编译器允许自己转换类型错误的数据。这意味着它效率不高,但更令人担忧的是我认为我指的是原始数据;也许我会使用它的地址,但没有意识到我实际上使用的是临时地址。此代码中对bar的调用失败。这是可取的,因为引用的类型不正确。对bar_const的调用也是错误的类型,但它会自动编译。这对我来说是不可取的。#includeusingnamespacestd;intvi;voidfoo(int&){}voidbar(long&){}voidbar_const(constl

c++ - 在 C++ 中调用临时对象的析构函数的顺序是什么?

考虑以下代码:#includestructA{~A(){std::cout使用GCC编译并运行给出以下输出:~C~A~B是否保证在用其他编译器编译时,A、B、C类型的临时对象的析构函数会按此顺序调用?一般来说,如果有的话,析构函数调用临时对象的顺序是什么? 最佳答案 让我们谈谈子表达式及其顺序。如果E1排序在E2之前,这意味着E1必须在E2之前进行全面评估是。如果E1未排序E2,这意味着E1和E2可以按任何顺序进行评估。对于f(A()),在您的情况下与f(A()).operator相同,我们知道:A()在f(...)之前排序,f(.

c++ - 在抛出的异常中销毁临时字符串

考虑以下代码:std::stringmy_error_string="Someerrormessage";//...throwstd::runtime_error(std::string("Error:")+my_error_string);传递给runtime_error的字符串是字符串的operator+返回的临时字符串。假设此异常的处理方式如下:catch(conststd::runtime_error&e){std::coutstring的operator+返回的temporary什么时候销毁?语言规范对此有什么要说的吗?另外,假设runtime_error接受了一个const

c++ - 良好的编程实践与临时编程的速度

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭12年前。我知道良好的编程实践总是有助于项目的“长期运行”,但有时它们似乎会花费很多时间。例如,它建议我为我创建的每个类维护一个头文件和一个cpp文件,只保留头文件中的声明,而在cpp中定义。即使有10-12个类(class),这个过程也变得非常繁琐。每次添加新类依赖项和evthing时更新makefile..需要很多时间...当我忙着做这一切时,其他人只会在一个

c++ - 从临时变量返回的引用是否有效?

我遇到过一种情况,能够将方法调用链接到临时变量会非常有用:draw(Quad(0,0,1,1).rotate(90));//但是,我不确定临时变量是否会保持足够长的时间以供draw()函数使用它。这样做安全吗? 最佳答案 这种特殊用途是安全的。一个临时对象一直持续到创建它的完整表达式结束†;在这里,完整表达式是整个语句,包括对draw的调用。一般来说,这种模式可能很危险。以下给出了未定义的行为:Quad&rotated=Quad(0,0,1,1).rotate(90);draw(rotated);在我看来,我更希望类型是不可变的;与

c++ - 创建临时的 decltype

我有一个某种类型的对象,例如std::vectorv;现在,比方说,我想验证v释放其所有内部内存。在C++11之前shrink_to_fit()方法,推荐/保证的方法是swap()空的std::vector同类型的。但是,我不想指定对象的类型。我可以使用decltype指定类型,所以我想写这样的东西:std::vectorv;//usev....v.swap(decltype(v)());//Createatemporaryofsametypeasvandswapwithit.^^但是,上面的代码不起作用。我似乎无法创建decltype(v)类型的临时文件带有一个空的ctor(在本例中

c++ for循环临时变量的使用

以下哪个更好,为什么?(特别是c++)一个。inti(0),iMax(vec.length());//vecisacontainer,saystd::vectorfor(;ib.for(inti(0);i由于调用了length函数,我看到了(a)的建议。这让我很困扰。没有任何现代编译器将(b)优化为类似于(a)吗? 最佳答案 示例(b)与示例(a)的含义不同,编译器必须在您编写时解释它。如果,(出于某种我想不到的虚构原因),我编写了代码来执行此操作:for(inti(0);i我真的不希望编译器优化对vec.length()的每次调用

c++ - 从临时成员中删除成员时省略复制/移动

我想在没有不必要的移动或复制的情况下取出临时成员。假设我有:classTP{T_t1,_t2;};我想从TP()得到_t1和_t2。不复制/移动成员是否可能?我尝试过使用元组并尝试“转发”(我认为这是不可能的)成员,但我能得到的最好结果是移动,或者成员立即死亡。在下面的playground中,使用B::as_tuple2的成员死得太早,除非结果绑定(bind)到非引用类型,否则成员将被移动。B::as_tuple在客户端使用auto简单地移动是安全的。我认为这在技术上应该是可行的,因为临时对象会立即终止,并且成员确实会终止,同时它们可以绑定(bind)到调用站点上的变量(我错了吗?),

c++ - 使用临时 volatile 限定符优化共享数组访问

我想知道在以下情况下临时的volatile限定符是否会产生正确的行为。假设ISR收集数组中的值,一旦收集到足够的值,它就会发出准备就绪的信号。intarray[10];//observenovolatilehereintidx=0;//neitherherevolatileboolready=false;//buthere这里的ISR是伪代码ISR(){if(idx=10);}假设我们可以保证array将只在ready发出信号并且元素被访问后被读取通过特定方法仅:intread(intidx){//temporaryvolatilesemanticsvolatileint*e=(vol

c++ - 复制省略和临时绑定(bind)引用对象

C++草案指出:12.8p31Thiselisionofcopy/moveoperations,calledcopyelision,ispermittedinthefollowingcircumstances(whichmaybecombinedtoeliminatemultiplecopies):(...)whenatemporaryclassobjectthathasnotbeenboundtoareference(12.2)wouldbecopied/movedtoaclassobjectwiththesamecv-unqualifiedtype,thecopy/moveoper