草庐IT

临时表

全部标签

指向临时变量的 C++ 引用?

classClassB{intm_b;public:ClassB(intb):m_b(b){}voidPrintClassB()const{cout鉴于上面的代码,我很难理解这段代码:Q1>这行是什么意思?constClassB&af=ClassB(1);这是我的理解:afreferstoatemporaryvariableClassB(1)andaftertheexecutionofthisline,thetemporaryvariableisdestroyedandafreferstoanundefinedvariable.Duringthisprocedure,nocopy-co

c++ - 临时对象和引用有什么关系?

人们经常会读到不能将普通左值引用绑定(bind)到临时对象。因此,当他们不想涉及复制时,可以经常看到类A的方法将constA&作为参数。然而,这样的构造是完全合法的:double&d=3+4;因为它没有将临时对象3+4绑定(bind)到引用d,而是使用对象3+4初始化引用。正如标准所说,只有当值不是类型或引用(或继承)时,引用才会获胜't使用从使用转换或sth的临时对象(即另一个临时对象)获得的对象进行初始化。在这种情况下,您可以看到:inti=2;double&d=i;那是不合法的,因为i不是double类型,也不是从它继承的。然而,这意味着临时对象可以绑定(bind)到引用——但它

c++ - 正确命名的临时对象和右值引用/移动

在C++11之前,作为一种标准的编程习惯,临时变量通常被分配给变量以使代码更清晰。对于小型类型,通常会制作一个拷贝,对于较大的类型,可能会制作一个引用,例如:inta=int_func();Tconst&obj=obj_func();some_func(a,obj);现在,将其与内联表单进行比较:some_func(int_func(),obj_func());在C++11之前,这具有几乎相同的语义。随着右值引用和移动语义的引入,上面的内容现在完全不同了。特别是,通过强制obj键入Tconst&,您已经删除了使用移动构造函数的能力,而内联形式的类型可以是T&&代替。鉴于第一个是通用范例

c++ - 为什么需要 move 语义来消除临时拷贝?

所以我对move语义的理解是,它们允许您覆盖用于临时值(右值)的函数,并避免可能昂贵的拷贝(通过将状态从未命名的临时值move到您命名的左值)。我的问题是为什么我们需要特殊的语义?为什么C++98编译器不能省略这些拷贝,因为是编译器决定给定表达式是左值还是右值?例如:voidfunc(conststd::string&s){//Dosomethingwiths}intmain(){func(std::string("abc")+std::string("def"));}即使没有C++11的move语义,编译器仍然应该能够确定传递给func()的表达式是右值,因此不需要从临时对象进行复制

c++ - 如何在没有临时设置的情况下将设置差异 s1-s2 存储在 s1 中?

STL是否已经包含任何简单的方法或算法来将集合set1和set2之间的差异直接存储在set1中,而不需要临时设置变量?下面的示例代码显示了一些我已经尝试过的替代方案(没有用)和使用临时集tmp的解决方案(我想避免):int_tmain(intargc,_TCHAR*argv[]){std::setset1,set2;set1.insert(1);set1.insert(2);set1.insert(3);set1.insert(4);set1.insert(5);set2.insert(4);set2.insert(6);//NONEOFTHEFOLLOWINGALTERNATIVES

c++ - 如果没有对它的常量引用,临时对象会被删除吗?

让我们看一下这两个函数:std::stringget_string(){std::stringret_value;//Calculateret_value...returnret_value;}voidprocess_c_string(constchar*s){std::cout这里有两个可能的process_c_string调用,参数由get_string返回。没有绑定(bind)const引用到get_string的返回对象。process_c_string(get_string().c_str());对get_string的返回对象绑定(bind)const引用。conststd

c++ - (&const_object) 可以评估为临时地址

我曾与一位程序员讨论过,其要点是foo中的以下断言可以通过或不通过,具体取决于编译器。#includeconstinti=0;voidfoo(constint&i){assert(&::i==&i);}intmain(){foo(i);}他告诉我,(&i)表达式可以计算为某个临时对象的地址。因为我有疑问,所以我在这里。如何将对temp的引用传递给函数,如果在函数中我可以检查并使用i和参数的地址做任何我想做的事情,并且必须保留预期的语义。?例如#includeconstinti=0;boolfunc(constint&i){return&::i==&i;}intmain(){consti

c++ - 取消引用映射迭代器时返回对临时对象的引用

考虑这段代码#include#includeconstint&foo(conststd::vector&x,unsignedi){autoit=x.begin();std::advance(it,i);return*it;}clang和gcc都没有发出错误/警告,但是:#include#includeconststd::pair&bar(conststd::map&x,unsignedi){autoit=x.begin();std::advance(it,i);return*it;}用clang编译并使用-Werror结果::14:12:error:returningreference

c++ 可以通过引用传递临时 lambda(适用于 msvc/windows 但不适用于 gcc/linux)吗?

假设我有以下代码片段://globalvariablestd::threadworker_thread;//Templatefunctiontemplatevoidstart_work(Functor&worker_fn)//lambdapassedbyref{worker_thread=std::thread([&](){worker_fn();});}这样调用:voiddo_work(intvalue){printf("Hellofromworker\r\n");}intmain(){//Thislambdaisatemporaryvariable...start_work([do

C++ 返回对临时对象的引用或将它们存储在对象中

考虑以下处理const引用的代码:constint&func(constint&x){returnx;}structFoo{Foo(constint&x):m_x(x){}constint&getX(){returnm_x;}constint&m_x;};我想知道现在允许以下哪些(如果有的话):intx=func(int(7));inty=Foo(int(7)).getX();是否可以保证临时int对象在被赋值或getX使用之前仍然存在?更新:看来这是安全的-但究竟是为什么呢?是否因为临时对象以递归方式绑定(bind)到const引用,并且只要对它们的绑定(bind)引用存在,就保证存