草庐IT

标准化

全部标签

c++ - 使用指针作为容器迭代器是否违反标准

Angewmadeacommentvector使用原始指针作为迭代器类型很好。这让我大吃一惊。我开始研究它,发现对vector迭代器的要求只是它们是"RandomAccessIterators"明确指出指针符合条件:Apointertoanelementofanarraysatisfiesallrequirements编译器甚至为vector提供迭代器以进行调试的唯一原因,还是实际上我错过了vector的要求? 最佳答案 §24.2.1Sinceiteratorsareanabstractionofpointers,theirsem

c++ - 为什么 uintptr_t 和 intptr_t 是 C(和 C++)标准中的可选类型?

C99(及更高版本的标准)标准要求某些类型在header中可用.对于精确宽度,例如int8_t,int16_t等等...,它们是可选的,并且在标准中是有动机的。但对于uintptr_t和intptr_t类型,它们也是可选的,但我不认为它们是可选的而不是必需的。 最佳答案 在某些平台上,指针类型的大小比任何整型都大得多。我相信此类平台的一个示例是IBMAS/400,其虚拟指令集将所有指针定义为128位。此类平台的最新示例是Elbrus。它使用128位指针,这些指针是硬件描述符而不是普通地址。

c++ - 防止某些标准函数被调用

出于某些原因,我们不应该在我们的代码库中使用某些标准函数,例如std::sort()(我们有自己的实现)。有没有办法阻止调用这些函数,最好是在编译时引发错误?我查看了重写标准函数,但它会导致未定义的行为。 最佳答案 您不应该尝试覆盖标准库中的更改函数,因为在第一种情况下您将违反ODR,而在第二种情况下您的项目中可能使用的一些第三方可能会受到影响。我建议您为clang-tidy创建自定义检查并添加一个CI作业以在您的代码库上运行它。这需要一些时间,但我相信这是最好的选择。 关于c++-防止

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++ - 模板方法中的标准容器

问候。我不太清楚如何解释自己,但我相信一段代码会让你明白我打算做什么:templatevoidmyFunction(A&list){typenameA::iteratorcurrent=list.begin();typenameA::iteratorend=list.end();while(current!=end){current++;}}其中A是一个STL容器(vector、列表...)。这就像盗梦空间,但有模板:模板、模板内部等...问题是:当您的模板的一个参数本身就是一个模板时,您会怎么做...并且仍然希望支持此模板支持的所有类型。这当然不会编译(它说“A不是模板”)。有人知道

c++ - C++ STL 标准有变化吗?

我一直虔诚地使用SGI的StandardTemplateLibraryProgrammer'sGuide(STLPG)作为引用手册,每当我使用STL在C++中实现某些东西时。直到昨天,它从未让我失望,但昨天我在工作中使用std::vector并与我的一位同事结对编程,他告诉我使用assign方法。我不认识这种对我来说不寻常的方法,所以我开始挖掘std::vectorSTLPG的一部分,没有提及任何分配方法。我的同事将我指向cpluplus.com的页面std::vector你瞧,它与其他一些方法一起使用,例如at,我也从未见过。这让我很困惑,所以我对这个问题进行了中世纪研究,并深入研究

c++ - 这是 Mac OS X 10.6 C++ 标准 API 中的错误吗?

以下代码无法在MacOSX10.6上编译;它在STL_algobase.h中给出一个错误,遵循“实例化自[...]”消息列表。#includeintmain(void){std::vector*v=newstd::vector(1,NULL);return0;}为了使其编译,我必须在NULL周围进行显式转换,即将其替换为(int*)(NULL)。不过,这看起来有点尴尬,我怀疑是否真的有必要;它还使我的源代码看起来很奇怪,因为结构和更长的类型名称嵌套在命名空间等中。编辑(错误信息):/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/

C++ 标准,有点困惑吗?

我知道该标准于1998年获得批准,并于2003年更新以修复该标准(ISO标准)中的一些缺陷,尽管我不确定C++98与ANSIC标准之间的关系。我记得不止一次读到C++1998标准是基于其中一个C标准,我会假设ANSIC89而不是99,这是正确的吗?此外,我假设C++0x是下一个“future”标准的官方别名是否正确,而C++03..11..xx只是针对C++的某些“更新”0x标准,C++11只是11年碰巧发生的更新?对于我来说,我在网上找不到太多东西,例如搜索基于什么和“C++标准列表及其引入的内容”几乎什么也找不到,除非我只是需要一个新鲜的头脑来找到其他任何东西。谢谢。

c++ - 如何从标准流中导出我自己的流?

如何从标准流派生出我自己的流?C#语言中有一个Stream类,但是C++的流太复杂了。我想要这样的东西:classmy_stream:publicstd::stream{//Howtoderive?};voidusing_a_stream(std::stream*s){*s注意:代码只是一个示例,可能是无效的C++程序。谢谢。 最佳答案 我认为这个问题的答案分为三个层次:级别1:它很复杂,特别是如果您是C++的新手,请立即停止。仅当您喜欢冒险时,才继续到第2级。级别2:使用一些可以更轻松地创建流的库。我建议使用Boost.IOStr

c++ - begin(container) 和 end(container) 是否标准化?

非成员函数模板begin(container)和end(container)是C++0x的一部分吗?如果是这样,它们位于哪个头文件中? 最佳答案 是的,但就像swap一样定义在不同的地方并取决于ADL,begin也是如此和end.“通用”版本在中定义://24.6.5,rangeaccess:templateautobegin(C&c)->decltype(c.begin());templateautobegin(constC&c)->decltype(c.begin());templateautoend(C&c)->decltyp