草庐IT

c++ - boost::shared_ptr 标准容器

假设我有一个foo类,并希望使用std::map来存储一些boost::shared_ptrs,例如:classfoo;typedefboost::shared_ptrfoo_sp;typededstd::mapfoo_sp_map;foo_sp_mapm;如果我向map添加一个新的foo_sp但使用的键已经存在,现有的条目是否会被删除?例如:foo_sp_mapm;voidfunc1(){foo_spp(newfoo);m[0]=p;}voidfunc2(){foo_spp2(newfoo);m[0]=p2;}原来的指针(p)被p2替换后会不会被释放?我很确定会这样,但我认为值得询问

c++ - 为什么在将 std::vector 与默认构造函数一起使用时会出现异常行为?

总结我最近看到了一些关于std::vector的问题,出于好奇,我一直在研究它们。我从来没有真正使用过STL,但我知道你可以使用vector来处理对象数组的分配,而且我可以发誓有一种方法可以使用默认构造函数在vector是创建。的确,这个问题Initializingastd::vectorwithdefaultconstructor处理使用复制构造函数和默认值与仅使用默认构造函数初始化vector。但是,由于我一直在VisualStudio2010中使用C++控制台应用程序项目进行一些试验,因此我没有得到与此解释一致的结果。根据对上述问题(givenhere)的回答中的评论之一,如果您

c++ - 将无效的 int 值转换为枚举

说我有enumFoo{Foo0,Foo1,Foo2};请注意,没有明确声明的Foo常量具有值3(它们是0、1和2)。以下是否会调用未定义的行为?Fooyay=(Foo)3;请特别注意3可能适合Foo的内部表示。 最佳答案 定义明确。为了表示值0、1和2,类型Foo必须至少有两个位,这也足以表示3。 关于c++-将无效的int值转换为枚举,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

c++ - 当链接器可以使用显式特化时,所有编译器都会忽略生成的模板代码吗?

我最近在专门化模板时遇到了让我感到不安的情况:foo.h:templatevoidfoo(){std::coutfoo.cc:#include"foo.h"templatevoidfoo(){std::cout"主.cc:#include"foo.h"intmain(){foo();}所以。我编译如下:g++-cmain.ccg++-cfoo.ccg++-omainmain.ofoo.o输出是"Thisisfoo".我喜欢这个输出。但我担心我所观察到的可能是gcc独有的(我无权访问其他编译器,因此无法检查)。这是我认为gcc正在做的事情:编译main.cc时,我希望它发出foo调用的通

c++ - 使用智能指针复制构造函数

我有一节课std::unique_ptr作为类(class)成员。我想知道如何正确定义复制构造函数,因为我收到以下编译器错误消息:errorC2248:std::unique_ptr::unique_ptr:cannotaccessprivatememberdeclaredinclass'std::unique_ptr.我的类(class)设计类似于:templateclassFoo{public:Foo(){};Foo(Bar*,int);Foo(constFoo&);~Foo(){};voidswap(Foo&);Foooperator=(Foo);private:std::uni

c++ - 从派生调用时编译器找不到基类方法,并且派生定义了具有附加参数的相同命名方法

这是一个带有简单代码粘贴的ideone链接:http://ideone.com/BBcK3B.基类有一个无参函数,而派生类有一个带参数的函数。一切都是公开的。为什么从B的实例调用时编译器找不到A::foo()?代码:#includeusingnamespacestd;classA{public:virtualvoidfoo(){cout编译错误:prog.cpp:Infunction‘intmain()’:prog.cpp:25:11:error:nomatchingfunctionforcallto‘B::foo()’b.foo();^prog.cpp:25:11:note:cand

c++ - 为什么异构查找比较器不是默认的?

我们在C++14中进行了异构查找。我想知道为什么map、set等的默认比较器没有更改为less。如果没有此更改,普通C++用户将完全错过此功能,并且在set中查找constchar*时的性能损失仍然存在。我在我公司的代码库中已经多次看到这种模式。甚至MS在其GoingNative视频中也表明这是一个真正的性能瓶颈。我怀疑代码被破坏是问题所在,但我看不出对于已经在c++98/11中运行的代码怎么会发生这种情况 最佳答案 考虑:structFoo{booloperators;Barb;s.find(b);默认情况下,s使用std::le

c++ - 万不得已/包罗万象/后备模板过载

正如我之前提出的一个问题所示,Overloadresolution,templatesandinheritance,将在需要派生到基础转换的重载之前选择模板重载。但是,有没有一种方法可以提供回退过载,只有在没有其他匹配项的情况下才会选择它作为绝对的最后手段?在这种特殊情况下,可以使用enable_if,但不幸的是,这将无法扩展。像这样://Mylibraryhasthisandhasnoknowledgeofthepossibleoverloadsoffootemplatevoidfoo(constT&){/*Dosomething*/}//Theuserofthelibrarypro

c++ - 如何就地初始化数组?

如何在不复制或移动构造临时元素的情况下初始化数组?当元素具有显式deleted复制或移动构造函数时,只有当元素具有默认构造函数或具有所有默认参数的构造函数时,我才能初始化数组,并且我执行以下操作之一:(a)明确声明数组,(b)直接初始化和零初始化数组,或(c)复制初始化和零初始化数组。直接(但不是零)初始化和复制(但不是零)初始化都不会编译。structFoo{Foo(intn=5):num(n){}Foo(constFoo&)=delete;//Foo(Foo&&)=delete;//ERRORFooa5[2]={5,5};//copyinitialization->ERROR}这3

c++ - 在实现中重新包含 header

假设我有一个标题foo.h像这样:#ifndefFOO_H#defineFOO_H#include#include"non_standard_class.h"std::stringfoo(MyClassa);...#endif和实现foo.cpp将是#include#include"foo.h"std::stringfoo(MyClassa){std::vectorx;MyClassb;...}重新包含是一个好习惯吗?和non_standard_class.h在foo.cpp?重点是:如果我阅读foo.cpp我如何理解MyClass来自哪里?我需要看看foo.h但这会更加困难。