草庐IT

C++ 使用 C++11 (std::shared_ptr) 分配 shared_ptr:将 shared_ptr 初始化为临时变量是否仍然不好?

我正在阅读thisanswer作者指的是boostbestpractices其中说:Avoidusingunnamedshared_ptrtemporariestosavetyping;toseewhythisisdangerous,considerthisexample:voidf(shared_ptr,int);intg();voidok(){shared_ptrp(newint(2));f(p,g());}voidbad(){f(shared_ptr(newint(2)),g());}Thefunctionokfollowstheguidelinetotheletter,wher

c++ - C和C++中的编译器优化和临时分配

请查看以下在C和C++中有效的代码:externintoutput;externintinput;externinterror_flag;voidfunc(void){if(0!=error_flag){output=-1;}else{output=input;}}是否允许编译器以与下面类似的方式编译上面的代码?externintoutput;externintinput;externinterror_flag;voidfunc(void){output=-1;if(0==error_flag){output=input;}}换句话说,是否允许编译器生成(从第一个片段开始)始终向out

c++ - 临时对象存储在哪里?

temporaryobjects是真的吗?存储在动态(堆)内存中? 最佳答案 标准没有为它们强制要求任何内存区域(堆/堆栈),但它们就像局部变量“自动存储”一样,位于表达式的末尾(或绑定(bind)到ref-to-时更长)const)它们被破坏了。大多数实现会将它们存储在堆栈中,就像局部变量一样。编辑:正如JamesKanze所指出的:在通过ref-to-const延长临时对象的生命周期的情况下,它的存储位置在大多数实现中都多少取决于该引用的存储位置。也就是说,在静态存储中引用的情况下,临时文件也将如此(刚刚在gcc上确认)。(尽管

c++ - 使用临时地址安全吗?

在我的程序中,我想获取一个临时地址。这是一个例子:#includestructNumber{intvalue;Number(intn){value=n;}};voidprint(Number*number){std::coutvalue这将输出:123456要编译,需要-fpermissive标志。这是我的问题:这是否安全并且可靠?在什么情况下可能会出错? 最佳答案 如果您对“安全可靠”的定义包括“如果编译器更新,将编译并产生相同的结果”,那么您的示例无效。您的示例在所有C++标准中都是错误格式的。这意味着,即使现在可以强制编译器接

c++ - 禁止实例化为临时对象 (C++)

我喜欢在c++中使用哨兵类,但我似乎有一种精神上的痛苦,导致反复编写如下错误:{MySentryClass(arg);//...othercode}不用说,这失败了,因为哨兵在创建后立即死亡,而不是像预期的那样在作用域结束时死亡。有什么方法可以防止MySentryClass被实例化为临时类,这样上面的代码要么编译失败,要么至少在运行时中止并显示错误消息? 最佳答案 我想不出一种自动方法来检测您是否犯了这个错误。您始终可以创建一个扩展为正确内容的宏,如果您继续错误地使用它,则可以使用它来声明哨兵。#defineMY_SENTRY_CL

c++ - 在打印 "Here"之前,临时 A(3) 不应该被销毁吗?

临时的A(3)是否应该在打印“Here”之前销毁?#includestructA{inta;A(){std::cout输出:A(1)A(2)A(3)Here~A()3~A()2~A()1Liveexample 最佳答案 A(3)不是一个临时对象,而是一个名为A的A类型的对象。和这个逻辑是一样的:Aa[2]={A(1),A(2)},a2(3);我实际上并不知道你被允许这样做。 关于c++-在打印"Here"之前,临时A(3)不应该被销毁吗?,我们在StackOverflow上找到一个类似的

c++ - 返回一个临时对象是否会在 C++ 中创建一个临时对象?

考虑以下C++代码:structA{A(int);};Afoo(){returnstatic_cast(0);}Ax=foo();在这里static_cast(0)根据标准[5.2.9-4]创建一个临时对象,它是纯右值。标准[12.2-1]说Temporariesofclasstypearecreatedinvariouscontexts:bindingareferencetoaprvalue(8.5.3),returningaprvalue(6.6.3),aconversionthatcreatesaprvalue(4.1,5.2.9,5.2.11,5.4),throwinganex

C++11:使用 std::move 只对临时对象安全吗?

在我的代码中,我有这样的东西:unordered_multimap>mEntities;...vector>rawEntities;if(qi::phrase_parse(&buf[0],(&buf[0])+buf.size(),EntityParser(),qi::space,rawEntities)){for(auto&propGroup:rawEntities){autosearch=propGroup.find("classname");if(search!=propGroup.end()){//isstealingpropGroupsafe???mEntities.empla

c++ - 为什么没有针对未使用的临时文件的 gcc/g++ 警告?

考虑以下代码:voidListenerImpl::attach(boost::shared_ptrsubscriber){boost::unique_lock(mtx);subscribers.push_back(subscriber);}voidListenerImpl::notify(MsgPtrmsg){boost::unique_lock(mtx);//notifyallsubscribersBOOST_FOREACH(boost::shared_ptrsubscriber,subscribers){subscriber->update(msg);}}(这是GoF中描述的观察者

c++ - 使用临时函数对象进行全局初始化

下面的代码#includestd::mt19937generator((std::random_device())());只用clang编译文件:$clang++-c-std=c++0xtest.cpp但是gcc失败了:$g++-c-std=c++0xtest.cpptest.cpp:3:47:erro:expectedprimary-expressionbefore‘)’token该代码在C++11中有效吗?它是GCC中的错误还是Clang的扩展/错误? 最佳答案 gcc将子表达式(std::random_device())()解