草庐IT

c++ - 为什么这个 STL 映射的条目没有在 GCC 4.5.1 中初始化?

这是代码摘录。std::maptemp;temp[0]=.1;cout我正在使用GCC版本4.4.1进行编译,并且我从temp[1]中获得了0值,正如我所期望的那样。我的同事正在使用GCC4.5.1版进行编译。在Debug模式下(使用-g标志),他得到1000。当编译Release模式(-O2标志)时,他得到0。我的想法是,这是未初始化变量通常会出现的问题类型,除了map应该根据thisquestion调用其元素的默认构造函数之外。和其他几个人喜欢它。此外,Josuttis的C++标准库指出Ifyouuseakeyastheindex,forwhichnoelementyetexist

c++ - 当重载具有多重继承的函数时,GCC 说调用它是不明确的,但 Clang 和 MSVC 没有

我正在使用这个变体库:https://github.com/cbeck88/strict-variant.它提供了一个类似于std::variant和boost::variant的类。鉴于此struct:structS{explicitS(double){}};我想这样做:strict_variant::variantv=2.0;这适用于Clang5.0.1和MSVC19.12.25831.00,但无法使用GCC7.2.1进行编译。我查看了库的代码并将问题简化为:#includestructS{constexprS(){}constexprexplicitS(double){}};te

c++ - 为什么在 gcc 中允许带有 std::string 的模板化 constexpr?

为什么gcc允许编译模板版本?它是编译器错误还是与模板一起使用时实际上有效?有人可以给我解释一下吗?它不能在clang或godbolt.org上使用的其他编译器上编译。编译错误是由在constexpr中使用的字符串和字符串流产生的。#include#include#includetemplateconstexprstd::stringfunc1(Ta,Tb)//Compilesandruns{std::stringstreamss;ss 最佳答案 GCC可能就在这里。根据dcl.constexpr第6段:Iftheinstantia

c++ - gcc 4.7.1 是否支持线程?

我遵循了说明here关于设置CodeBlocks以使用GCC4.7.1。我提到的页面上提供的示例编译得很好,但是当我尝试编译以下代码时,它随后产生了错误。我必须说我什至将编译器设置为C++11标志通过编译器设置(-std=c++11)但仍然没有运气。编译失败的代码:#include#include#include//Thisfunctionwillbecalledfromathreadvoidfunc(inttid){std::coutth;intnr_threads=10;//Launchagroupofthreadsfor(inti=0;i错误:main.cpp||Infuncti

c++ - GitHub 上的项目需要带有 Qt4、sqlite3、cmake、git、gcc 的托管 CI 服务器

我主持了mycode(用C++编写)在GitHub上,并希望将其链接到托管持续集成(CI)服务器,如TravisCI或BuildHive.然后我希望在我的项目页面上看到“构建通过”或“构建失败”。但是当我检查这两个服务的CI环境时,TravisCI最接近gcc、git、cmake和sqlite3的可用性,但我缺少另一个关键库Qt4,它是构建我的项目所必需的。它也应该是免费的,因为它是一个免费的开源项目。请告诉我该怎么做?谢谢。我需要:gcc、git、cmake、sqlite3和Qt4。 最佳答案 下面的.travis.yml解决了我

c++ - qmake:处理 gcc 和 msvc 的选项

我想制作一个可以同时使用msvc和gcc的项目文件。例如,要优化速度,您可以执行cl/O2和g++-O3。但我不知道如何告诉项目文件来产生差异。我想要这样的东西:msvc:QMAKE_CXXFLAGS_RELEASE+=/O2/openmp/arch:AVXelse:QMAKE_CXXFLAGS_RELEASE+=-O3-march=native-fopenmp-D_GLIBCXX_PARALLEL可悲的是,这不起作用。其他方法是更改​​mkspecs并将新的与我的应用程序捆绑在一起,但它不是很便携。谢谢! 最佳答案 Jean,准确

c++ - C++17 std::shared_mutex 还不可用吗?

查看C++compilersupport,看来std::shared_mutex的未计时版本在GCC5.0+中可用。但是,即使使用gccversion5.3.020151204(Ubuntu5.3.0-3ubuntu1~14.04),并用-std=c++1z编译,共享互斥体的简单初始化以:error:‘shared_mutex’innamespace‘std’doesnotnameatypestd::shared_mutexmutex_;不,我已经包含了正确的header:#include.它找不到正确的header,因为它似乎不存在。实际上,链接器使用位于/usr/include/c

C++:是否需要使用相同版本的 GCC 和 GDB 进行调试

我正在使用minGW在Windows上使用C++进行开发。我目前有调试问题。我必须使用旧版本的GCC(4.4)。所以我只是想知道是否可以使用这个旧的GCC进行编译并使用新的GDB进行调试?这两者之间有什么联系?(任何有关调试器崩溃的指示也将不胜感激!我只知道我需要确保使用调试DLL) 最佳答案 GDB和GCC是独立的程序——独立的源代码库(有一些共享代码,虽然不多),通常是独立的维护者,不同的发布时间表和不同的版本号。他们确实有一些共同的文化,当然也有一些协调。GDB在向后兼容性方面相当不错。它甚至为旧版本的GCC和有时其他编译器发

c++ - 为什么 g++5 在自动类型推导中推导对象而不是 initializer_list

我最近发现了这段代码:structFoo{};intmain(){Fooa;//clang++deducesstd::initializer_list//g++5.1deducesFooautob{a};a=b;}它在g++5.1中编译良好,但在clang++中失败(同时使用-std=c++11和-std=c++14,结果相同)。原因是clang++deducesthetypeofbasstd::initializer_list,而g++5.1deducesasFoo.AFAIK,类型确实应该是(确实违反直觉)std::initializer_list这里。为什么g++5将类型推断为F

c++ - gcc used 属性的用例是什么?

#include//xyzwillbeemittedwith-flto(orifitisstatic)evenwhen//thefunctionisunused__attribute__((__used__))voidxyz(){printf("HelloWorld!\n");}intmain(){return0;}我需要这个做什么?除了直接调用函数之外,还有什么方法可以到达xyz吗,比如一些dlsym()之类的魔法? 最佳答案 Attributeused在您想要强制编译器发出符号的情况下很有用,而通常情况下它可能会被省略。作为GC