草庐IT

c++ - "const"声明有助于编译器 (GCC) 生成更快的代码吗?

这个问题在这里已经有了答案:Doesconst-correctnessgivethecompilermoreroomforoptimization?(7个答案)关闭8年前。const声明是否有助于编译器(GCC)生成更快的代码,还是它们仅对可读性和正确性有用?ZedShaw认为const在C/C++中没有用或被过度使用:Nextisallthebizarrefascinationwithconst.ForsomeoddreasonC++lovestomakeyouslapconstoneverypartofadeclaration,andyetIgetthesameendresulta

c++ - gcc 的非空终止字符串编译器选项

更新事实证明这只是“c++不是c蓝调”的另一种情况我想要什么constcharhex[16]="0123456789ABCDEF";唯一有效的方法charhex[16]="0123456789ABCDE";hex[15]="F";是否有任何编译器选项或我可以做些什么来使字符串在gcc编译器中不以null结尾。这样我就可以制作一个(n)常量数组 最佳答案 不需要编译器选项,它已经非NUL终止。该标准规定只有在可以容纳的情况下才应添加NUL,否则会溢出。可能只是内存中数组后的下一个字节是\0§6.7.8p14Anarrayofchara

c++ - 如何删除#pragma 区域的 GCC 警告?

如何删除#pragmaregion上的GCC警告?我添加了pragmaregion以轻松查看代码,但它在#pragmaregion上报告警告。我正在使用VisualStudio2010。 最佳答案 gcc有这个警告标志:-Wunknown-pragmasWarnwhena#pragmadirectiveisencounteredwhichisnotunderstoodbyGCC.Ifthiscommandlineoptionisused,warningswillevenbeissuedforunknownpragmasinsyste

c++ - GCC 和 VC++ 之间 std::vector::emplace_back 的区别

这个问题在这里已经有了答案:Canstd::vectoremplace_backcopyconstructfromanelementofthevectoritself?(3个答案)关闭7年前。我听说ModernC++的建议之一是使用emplace_back而不是push_back来追加到容器中(emplace_back接受容器中存储类型的任何构造函数的任何版本参数。根据标准草案N379723.3.6.5(1),说:Remarks:Causesreallocationifthenewsizeisgreaterthantheoldcapacity.Ifnoreallocationhappe

c++ - 名称查找问题,GCC 和 clang 不同意

这个问题在这里已经有了答案:gcccancompileavariadictemplatewhileclangcannot(1个回答)关闭7年前。正如ecatmur所指出的,这个问题已经有了答案here.这个问题显然不是trailingreturntypeusingdecltypewithavariadictemplatefunction的重复问题.它实际上试图提出一个更简单的解决方案来解决该线程中的问题。问题是根据标准,这个解决方案是否正确,因为GCC和clang不同意。只要更仔细地阅读问题,您就会意识到这一点。这个问题的灵感来自thisone.我正在尝试提出一个比已经提供的解决方案更

c++ - 奇怪的 GCC 数组初始化行为

我在查看另一个问题时遇到了此代码的变体(原始代码使用了std::thread而不是std::vector,但语法是相同的):#include#include#include#includeintmain(){std::vectorvecs[10]=std::vector(10,1);for(auto&vec:vecs){std::copy(vec.begin(),vec.end(),std::ostream_iterator(std::cout,""));std::cout这段代码不应该编译;std::vectorvecs[10]=std::vector(10,1);是无效的初始化语法

c++ - GCC 无法从模板函数中推断出自动返回类型?

我有一个简单的模板函数do_something,它返回一个整数:123。templateautodo_something(Tinput){std::this_thread::sleep_for(std::chrono::seconds(1));return123;}intmain(intargc,char*argv[]){std::functionfunction=std::bind(do_something,12);function();return0;}使用GCC6.1.1,我得到这个错误:test.cpp:Infunction‘intmain(int,char**)’:test.

指向成员的指针的 C++ 类内初始化使 MSVC 失败(但 GCC/Clang 工作)

这是一个非常简单的C++代码:#includestructA{inta;constexprstaticintA::*p=&A::a;virtualvoidf(){}};intmain(){Ax;x.a=0;x.*(A::p)=1234;std::cout更令人震惊的是,这段代码在GCC、Clang和MSVC之间显示了不同的结果。我试过4个编译器GCC:编译良好,打印1234。Clang:编译良好,打印1234。MSVC(在线):编译失败。带有VisualStudio2019的MSVC(本地):编译良好,打印0。(有趣的是,如果我删除f(),它会打印1234。)我不确定用它自己的成员对指

c++ - 在 GCC、Clang 和英特尔编译器中强制内联单个宏?

我有一个函数需要在C++11的紧密循环中内联我希望该函数在与header不同的文件中实现,并且仍然强制在使用它的任何地方内联它。另外,我想同时使用clang、GCC和Intel编译器进行编译。充实要求。我正在寻找一个允许我执行类似操作的宏:#defineforce_inline在标题中:force_inlinevoidfoo();我应该能够在实现文件中做到这一点:voidfoo(){...Code..}需要说明的是,我不想将代码放在标题中。我希望它们只包含函数的声明。有没有一种方法可以使用适用于所有这些编译器的宏来实现内联?到目前为止我最好的解决方案是这个宏:#defineforcei

c++ - clang vs gcc - 空通用 lambda 可变参数包

我想我发现了另一个“clangvsgcc”lambda和可调用对象之间的不一致。decltype(l)::operator()应该等同于C::operator(),但是如果可变参数包在通用lambda、gcc中留空拒绝编译:15:error:nomatchforcallto'(main()::)(int)'l(1);15:note:candidate:decltype(((main()::)0u).main()::(x,))(*)(auto:1&&,auto:2&&,...)15:note:candidateexpects3arguments,2provided14:note:cand