鉴于我的变量是一个指针,如果我将它分配给“自动”类型的变量,我是否指定“*”?std::vector*getVector();//returnspopulatedvector//...std::vector*myvector=getVector();//assumehasnitemsinitautonewvar1=myvector;//vs:auto*newvar2=myvector;//goalistobehavelikethisassignment:std::vector*newvar3=getVector();我对这个auto如何在c++11中工作感到有些困惑(这是c++11的一
我很少看到decltype(auto),但是当我看到它时,我会感到困惑,因为它似乎在从函数返回时与auto做同样的事情。autog(){returnexpr;}decltype(auto)g(){returnexpr;}这两种语法有什么区别? 最佳答案 auto遵循模板参数推导规则,始终为对象类型;decltype(auto)遵循decltype规则,根据值类别推导引用类型。所以如果我们有intx;int&&f();然后expressionautodecltype(auto)-----------------------------
std::unique_ptrp1(newint);std::unique_ptrp2(newint);p2=p1;这里似乎p1不再是“唯一的”,因为p2也引用了它这是合法的c++吗?unique_ptr有copy_semantics吗?如果不是,并且它只有移动语义,那么在将p1分配给p2之后是否将其设置为NULL?编辑:好的,所以正确的版本是p2=std::move(p1)据此,在此分配之后,p1无效?和auto_ptr的区别就在这里?明确指定所有权的转移比隐含的更安全,因为我猜想auto_ptr就是这种情况 最佳答案 std::
在我的代码中,我希望boost::shared_ptr不调用delete,而是调用ptr->deleteMe()。我还有一些返回ptr的C风格函数。我可以叫它lib_freeXYZ(ptr);而不是尝试删除? 最佳答案 或者如何使用STL来提供包装仿函数-DougT.描述但没有自定义调用者。boost::shared_ptrptr(newT,std::mem_fun_ref(&T::deleteMe));boost::shared_ptrptr(newS,std::ptr_fun(lib_freeXYZ));
我想在某个时候使用boost::log,但我不能将std::shared_ptr作为参数传递,因为编译器(VS2010)无法转换将其转换为boost::shared_ptr。我真的不喜欢他们彼此是外星人这一事实。是否有一种安全且透明的方式将一个转换为另一个,以免它们相互绊倒?我不认为它与thisquestion重复这表明两者是相同的。 最佳答案 你可以这样做:templateboost::shared_ptrmake_shared_ptr(std::shared_ptr&ptr){returnboost::shared_ptr(pt
我读过"Multiplethreadscansimultaneouslyreadandwritedifferentshared_ptrobjects,evenwhentheobjectsarecopiesthatshareownership."(MSDN:ThreadSafetyintheStandardC++Library)这是否意味着更改shared_ptr对象是安全的?例如,下一个代码是否被认为是安全的:shared_ptrglobal=make_shared();...//Inthread1shared_ptrprivate=global;...//Inthread2globa
我有很多boost::shared_ptr对象,并且在某些时候我故意想要delete其中一些释放一些内存。(那时我知道我再也不需要指向MyClass的对象了。)我该怎么做呢?我想你不能只调用delete()使用我通过get()获得的原始指针.我见过一个函数get_deleter(shared_ptrconst&p)在boost::shared_ptr,但我不知道如何使用它,而且它旁边还写着experimental。(我想我有Boost1.38。)也许只是分配一个新的空boost::shared_ptr变量?那应该丢弃旧值并将其删除。 最佳答案
当我使用auto推导指针类型时,我发现了一个奇怪的现象。我的代码是这样的:#includeusingnamespacestd;intmain(){inti=100;autop1=&i;auto*p2=&i;cout编译执行后,我们可以发现*p1和*p2的结果是一样的,都是100。也就是说p1和p2都是指向int对象的指针对象。[user@host~]$./test100100这两个定义p1和p2的语句有什么区别吗? 最佳答案 不同的是,第一种情况下auto被推导为int*,而第二种情况下auto被推导为int,这导致两个p1和p2的
如果非静态数据成员在声明中被初始化,C++11是否允许将非静态数据成员声明为“自动”?例如:structS{autox=5;//inplaceof'intx=5;',whichisdefinitelyallowed};GCC4.7拒绝上述代码,而接受intx=5;.假设这不是编译器错误,而是标准确实不允许,为什么不呢?它与声明局部变量auto一样有用。 最佳答案 禁止非静态成员的规则在7.1.6.4第4条:Theautotype-specifiercanalsobeusedindeclaringavariableinthecondi
我正在尝试“现代化”一些现有代码。我有一个类,它当前有一个成员变量“Device*device_”。它在一些初始化代码中使用new创建实例,并在析构中有一个“deletedevice_”。该类的成员函数调用许多以Device*作为参数的其他函数。这很好用,但为了“现代化”我的代码,我认为我应该将变量更改为"std::unique_ptrdevice_"并删除对删除的显式调用,这使代码更安全,通常更好。我的问题是这个-我应该如何将device_变量传递给所有需要它作为参数的函数?我可以调用.get来获取每个函数调用中的原始指针。但这看起来很丑陋,并且浪费了一些首先使用unique_ptr