草庐IT

c++ - 类模板中名称解析的实际结果与c++ 03标准不同

我在Xcode4.1和VisualStudio2008上测试了c++标准ISO/IEC14882-0314.6.1/9中的代码。两个编译器的输出都与标准的预期结果不同。代码粘贴在下面。#include#includeusingnamespacestd;voidf(char);templatevoidg(Tt){f(1);f(T(1));f(t);}voidf(int);voidh(){g(2);g('a');}voidf(int){cout作为标准的描述。预期的输出应该是fcharfintfintfcharfcharfchar在Xcode4.1上构建并运行代码。输出如下。在build设

c++ - 为什么 C++03 要求模板参数有外部链接?

背景在C++03中,用作模板参数的符号必须具有外部链接;正如thispreviousquestion中所探讨的,此限制在C++11中已删除。:InC++03,templateargumentscouldnothaveinternallinkage:[C++03:14.6.4.2/1]:Forafunctioncallthatdependsonatemplateparameter,ifthefunctionnameisanunqualified-idbutnotatemplate-id,thecandidatefunctionsarefoundusingtheusuallookuprul

c++ - ISO C++03 对在函数范围内定义的结构有什么限制?

我们不允许在函数内部定义仿函数结构,因为不允许在函数模板的实例化中使用函数声明的结构。还有其他需要注意的重大陷阱吗?例如。这会很糟糕吗:intfoo(){structScratch{inta,b,c;};std::vectorworkingBuffer;//BlahBlah} 最佳答案 1.C++标准禁止使用带有模板的本地定义类。14.3.1/2:本地类型、无链接类型、未命名类型或由这些类型中的任何一种复合的类型不得用作模板参数对于模板类型参数。代码示例:templateclassX{/*...*/};voidf(){structS

c++ - C++11 (C++0x) 是完整的 C++03 超集吗?

C++被认为是(几乎)C的超集;但仍有某些东西在C中有效,而在C++中无效。是否有任何功能/设施是有效的C++03但在C++11中不起作用? 最佳答案 Isthereanyfeature/facilitywhichisavalidC++03butnotworkinginC++11?有一些不兼容的地方:exporttemplate被移除(不被弃用,真正被移除)您不能再使用auto作为存储说明符新增保留字:alignof、char16_t、char32_t、constexpr、decltype、noexcept、nullptr、stat

c++ - C++03 中的标识符中是否允许使用美元符号?

C++标准对在标识符中使用美元符号(例如Hello$World)有何规定?他们合法吗? 最佳答案 c++标识符可以由以下任何一种组成:_(下划线)、数字0-9、字母a-z(大写和小写),并且不能以数字开头。由于C99允许对标准进行扩展(例如visualstudio),因此存在许多异常(exception)情况。 关于c++-C++03中的标识符中是否允许使用美元符号?,我们在StackOverflow上找到一个类似的问题: https://stackoverf

c++ - 防止 C++03 代码在 C++11 中表现不佳的好方法?

我有一些C++03代码为某些类实现了swap,以使std::sort(和其他功能)更快。不幸的是,std::sort现在似乎使用std::move,这意味着我的代码现在慢得多它在C++03中。我知道我可以使用#if__cplusplus>=201103L有条件地定义move构造函数/move赋值运算符,但我想知道是否有更好的方法不使用预处理器黑客?(我想避免对前处理器进行黑客攻击,因为它们会很丑陋,因为我不仅要测试像_MSC_VER>=1600这样的编译器版本,而且因为它们不会与无法识别C++11move语法但强制我预处理代码的LZZ等工具配合使用。) 最佳

c++ - 本地类 : C++03 vs. C++11

C++11中本地类的使用有什么变化吗?在C++03中,本地类似乎不能用作模板参数(我记得)。考虑这段代码,templatevoidf(constT&){}//Note:Sisalocalclassdefinedinsidemain()intmain(){structS{};f(S());}//Iwanttemplateargumenttobededuced.但它给出了编译错误(C++03模式),说(ideone):prog.cpp:4:error:nomatchingfunctionforcallto‘f(main()::S)’但是,在C++11模式(ideone)下编译时它编译得很好

c++ - 在 NULL 指针上调用 delete - C++03 与 C++11

在C++03标准中,我看到了:5.3.5Delete2Iftheoperandhasaclasstype,theoperandisconvertedtoapointertypebycallingtheabove-mentionedconversionfunction,andtheconvertedoperandisusedinplaceoftheoriginaloperandfortheremainderofthissection.Ineitheralternative,ifthevalueoftheoperandofdeleteisthenullpointertheoperation

c++ - C++03 是 C++ 标准的新版本还是只是 C++98 的技术勘误 (TC)?

我很确定我在某处的权威来源(我相信它在WG21页面上)读到C++03不是C++98的技术勘误,但它是C++标准的新版本。但我在GCC和其他编译器中只看到-std=c++98开关,AlfPSteinbach做了一个fewcomments暗示它可能确实是C++98的TC。所以当我写“C++03”时,提到C++98就足够了吗?作为一个相关的问题,使用术语“C++03”是否甚至错误?因为我觉得如果真的是C++98TC1,那么在我看来就不能叫C++03了。就像我从未见过有人为C99TC3版本编写C07一样。 最佳答案 是和不是。C++03(I

ubuntu - docker ;未找到 '18.03.0.ce' 的版本 'docker-ce'

我试图在Windows上运行的Ubuntu上安装Docker,我正在关注这个官方教程。https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1我可以在我的repo上看到它的列表,然后像教程一样输入命令sudoapt-getinstalldocker-ce=18.03.0.ce。但是出现了这个错误。该列表实际上显示了类似docker-ce|的版本。18.03.0~ce-0~ubuntu但我无法安装。我怎么错了?也许我犯了一个愚蠢的错误。 最佳答案