草庐IT

C++ GCC 为什么这段 sfinae 代码可以用 GCC 4.7 编译,但不能用 4.8 编译?

我喜欢在模板类中使用本地类来执行类似“staticif”的构造。但是我遇到了gcc4.8不想编译我的代码的问题。但是4.7可以。这个例子:#include#include#includeusingnamespacestd;structA{voidprintA(){coutstructTest{voidprint(){structIfA{constexprIfA(T&value):value(value){}T&value;voidprint(){value.printA();}};structIfB{constexprIfB(T&value):value(value){}T&value

c++ - 带有 -isysroot 的 gcc 创建包含以等号 "="开头的包含路径并且编译失败

我正在使用适用于arm(arm-none-linux-gnueabi)的CodeSourcery工具链进行交叉编译。我使用-isysroot指向rootfs文件夹下的/usr/include文件夹,但在编译时遇到了麻烦。我已验证包含文件夹可访问。下面是gcc调用和输出。一些输出已被删除,因为我认为它不相关。预处理器提供了一个包含路径,除了以“=”开头的字符外,该路径是正确的,并指示该路径不存在。然后找不到头文件。我怎样才能让它工作?willem@jacta:~/Projects/button/Debug$arm-none-linux-gnueabi-gcc-isysroot=/home

c++ - 无法使用 clang 编译代码,但可以使用 gcc

我正在尝试修复一个开源C++项目中的一些错误,而原作者目前忙于他的学术生活而无法提供帮助。通过macports安装的gcc-4.9代码编译得很好。我一直在命令行上使用lldb进行调试。但是,如果可能的话,我希望使用clang编译代码,因为这样我可以同时使用Xcode和lldb并使错误更容易隔离。当我尝试使用clang编译代码时,出现以下错误:Infileincludedfrom./src/include/hash.h:25:./src/include/hash_stream.h:18:11:error:calltofunction'operator>>'thatisneithervis

c++ - 使用 -lstdc++fs 选项后使用 GCC6 时出现实验性::文件系统链接器错误

在尝试使用当前的GCC在C++中使用一些新的/实验性的东西时,我遇到了链接错误。好像类似question已发布,但仍然出现错误。有人可以解释一下我在这里做错了什么/哪里错了吗?。希望我已经提供了与此相关的所有详细信息。test.cpp#include#include#includenamespacefs=std::experimental::filesystem;intmain(intargc,constchar*argv[]){std::strings(argv[0]);fs::pathp(s);std::coutIhavebuilt(debugversion)thenewgccve

c++ - 防止 gcc 中的 std::function 分配内存或增加阈值

有什么方法可以防止gcc中的std::function为较大的函数对象动态分配内存?我希望下面的代码可以在没有动态分配的情况下工作:#include#include//replaceoperatornewanddeletetologallocationsvoid*operatornew(std::size_tn){std::cout&stuff){returnstuff();}};intmain(){TestPlatetestor;testor.setValue(15);conststd::function&func=std::bind(&TestPlate::getValue,&te

c++ - 为什么 GCC 会为结构化绑定(bind)诊断未使用的变量而 Clang 不会?

让我们从一个最小的例子开始:#includeintmain(){auto[a,b]=std::pair(1,'A');returna;}使用GCC7.3编译传递-std=c++17和-Wunused-variable,并运行它::Infunction'intmain()'::5:15:warning:unusedvariable'b'[-Wunused-variable]auto[a,b]=std::pair(1,'A');^GCC可能会正确地报告未使用b,但它错误地将其称为变量。引用[dcl.struct.bind]/1:Astructuredbindingdeclarationin

c++ - gcc 在这里做什么来让每个线程运行一次这段代码?

我刚刚遇到了这种为每个线程运行一次代码的技术。我不知道它在最低级别上是如何工作的。特别是,fs指向什么?.zero8是什么意思?标识符是@tpoff是有原因的吗?intfoo();voidbar(){thread_localstaticauto_=foo();}输出(带-O2):bar():cmpBYTEPTRfs:guardvariableforbar()::_@tpoff,0je.L8ret.L8:subrsp,8callfoo()movBYTEPTRfs:guardvariableforbar()::_@tpoff,1addrsp,8retguardvariableforbar(

c++ - 递归嵌套模板——gcc 错误?

我有以下片段。templatestructf{templatestructa:f{};};intmain(){f::a::ax;}它在GCC4.4.5和MSVC2010上编译时没有警告,但在GCC4.5.2上却没有——我收到以下错误:test.cc:Infunction'intmain()':test.cc:11:21:error:expectedprimary-expressionbefore'double'test.cc:11:21:error:expected';'before'double'所以虽然我没有看到任何关于它的非标准,但问题是强制性的——这在C++中合法吗?另外,如果

c++ - GCC 4.7 istream::tellg() 在到达 EOF 后返回 -1

以下代码适用于gcc4.4。但是gcc4.7会给出断言失败。#include#include#includeusingnamespacestd;intmain(){stringinput("abcdefg");stringstreamiss(input);ostringstreamoss;oss在gcc4.7中,如果istream已经到达EOF,tellg()将返回-1。不会调用pubseekoff()和seekoff()在gcc4.4中这不是问题。应该是gcc4.4还是gcc4.7?为什么? 最佳答案 根据C++11第27.7.2

c++ - msvc 相当于 gcc 的 __BASE_FILE__

在VisualC++中是否有任何等效于__BASE_FILE__的东西?我想知道当前正在由VC++编译的文件的名称。注意:__FILE__展开为当前文件,例如它可能是#include之一。来自gcc的文档:__BASE_FILE__此宏以C字符串常量的形式扩展为主输入文件的名称。这是调用C编译器时指定为参数的源文件。 最佳答案 感谢John的评论,这是一个解决方法。如果您简单地输入__BASE_FILE__=%(Filename),它不会生成文字字符串。所以把它放在双引号之间;我还添加了扩展名,因为%(Filename)没有它。__