草庐IT

c++ - C++0x 中 allocator_traits<T> 的目的是什么?

为什么没有标准C++03接口(interface)用于查询C++0x中使用的分配器的成员类型?成员类型不足的用例有哪些? 最佳答案 为了从设计模式的角度解释allocator_traits,它是Adapter包装满足更少实现要求的自定义分配器(不需要构造,销毁,所有那些typedef...)并将其转换为FlyWeight使用静态成员和类型为您完成分配器实现要求的其余部分的对象。根据open-stddocScopedAllocatorModel的第3页,使用allocator_traits,您只需为自定义分配器提供至少10行代码。(感

c++ - 使用和不使用 std=c++0x 混合库的任何问题

我正在编写一个库,该库必须依赖于当前未编译并支持新标准的库。我想编译一个必须依赖于std=c++0x的库。这样做有什么问题吗? 最佳答案 如果混合使用不同编译器选项编译的库,则必须确保接口(interface)中数据类型的ABI相同。有些数据类型(如std::string)在C++03和C++0x之间有不同的接口(interface)和要求,所以使用它们的接口(interface)一定要小心。如果您的接口(interface)仅使用内置类型和您自己的类,而这些本身不使用任何标准库类,那么一切都应该没问题。否则,您将需要检查您正在使用

c++ - 一旦 C++0x 成为主流,boost 的重叠部分会发生什么?

一旦C++0x成为主流,boost的重叠部分会发生什么?boost是否仍会包含以前的所有内容,或者他们是否会调整库以使用新的std::内容对其进行更新?boost是否会同时拥有正常的c++版本和他们将维护的c++0x版本? 最佳答案 出于几个原因,人们会希望Boost继续支持现有的类。首先,有一段代码使用了Boost中的重叠特性,需要在一段时间内得到支持。其次,重叠的实现让我可以选择我更喜欢使用哪一个。std::Frob和Boost::Frob之间可能存在一些对我的项目很重要的区别,并且有选择是好的。不过,从长远来看,我希望应用程序

c++ - 在 C++0x lambda 中是否可以看到函数局部类型定义?

我遇到了一个奇怪的问题。以下简化代码重现了MSVC2010中的问题:templatestructdummy{staticTfoo(void){returnT();}};intmain(void){typedefdummydummy_type;autox=[]{boolb=dummy_type::foo();};//autox=[]{boolb=dummy::foo();};//works}我在函数中本地创建的typedef在lambda中似乎不可见。如果我将typedef替换为实际类型,它会按预期工作。这里有一些其他的测试用例://crashesthecompiler,creditto

c++ - C++0x 中的栅栏,一般只保证原子或内存

C++0xdraft有一个栅栏的概念,这似乎与CPU/芯片级别的栅栏概念非常不同,或者说linux内核人员对fences的期望.问题是草案是否真的暗示了一个极其受限的模型,或者措辞很差,实际上暗示了真正的围栏。例如,在29.8Fences下,它声明如下:AreleasefenceAsynchronizeswithanacquirefenceBifthereexistatomicoperationsXandY,bothoperatingonsomeatomicobjectM,suchthatAissequencedbeforeX,XmodifiesM,YissequencedbeforeB

c++ - _1 是 C++0x 的一部分吗?

我见过two最近answers使用_1作为纯C++0x解决方案(没有明确提及boostlambda)。有没有像std::_1这样的动物?我认为拥有原生lambda会使这样的构造变得多余。std::_1的Google代码搜索结果为tworesults来自同一个项目,因此尚无定论。 最佳答案 是的,它们是std::placeholders命名空间内C++0x的一部分,来自最新草案(n3126)§20.8.10.1.3“Placeholders”:namespacestd{namespaceplaceholders{//Mistheimp

C++0x 与 Qt Creator

我正在尝试使用QtCreator中的新C++0x功能在Windows下(QtCreator2.0.1)。我读了线程ConfiguringtheGCCcompilerswitchesinQt,QtCreator,andQMake并将QMAKE_CXXFLAGS+=-std=c++0x添加到.pro文件中。QtCreator在这个简单的代码上给了我非常奇怪的错误:#includeintmain(){}编译器错误:'::swprintf'hasnotbeendeclared'::vswprintf'hasnotbeendeclared我尝试使用命令g++test.cpp--std=c++0x

c++ - 谁能解释当前 C++0x 标准草案的这一段?

谁能解释ISON3242的这句话?§3.2,第二点Anexpressionispotentiallyevaluatedunlessitisanunevaluatedoperand(Clause5)orasubexpressionthereof.Avariableornon-overloadedfunctionwhosenameappearsasapotentially-evaluatedexpressionisodr-usedunlessitisanobjectthatsatisfiestherequirementsforappearinginaconstantexpression(5

c++ - 为什么我在检查核心转储时进入 gdb "Cannot access memory at address 0x..."?

我在分析核心转储时尝试打印以下行时收到此消息。(gdb)p/x*($esi)Cannotaccessmemoryataddress0xe6d3a030我提到%esi(0xe6d3a030)指向的地址应该指向一些有效的分配数据。(当我自己运行这个程序并按照相同的指令中断时,这个打印有一些有意义的信息)造成这种情况的可能原因是什么?我是否遗漏了核心转储中的一些信息?如果是,我缺少什么信息?核心转储不应该包含所有已分配内存的快照吗?编辑:当我在加载核心转储时在gdb“维护信息部分”命令中使用时,我得到下面显示的信息。我可以看到地址0xe6d3a030在0xe6d00000->0xe6dfb0

c++ - -std=c++0x 和 -std=c++11 有什么区别

我知道这些标志适用于Eclipse中的C++11。但我不知道有什么区别,哪个更受欢迎。似乎他们都在正常使用C++11。 最佳答案 你应该更喜欢-std=c++11。(注意:我假设-std=c++11x是您问题中的错字)旧的-std=c++0x仅适用于不支持-std=c++11的旧编译器版本,他们选择该名称来表达当时即将推出的C++11的特性(和ABI)的初步和不稳定的性质(当时还不清楚它是否最终会成为C++10或C++12)。他们更改了一些细节以适应C++11标准正式发布之前不断变化的标准工作草案。如果您的编译器支持-std=c++