草庐IT

clang_complete

全部标签

指向成员的指针的 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++ - 使用 clang 8 的 lambda 表达式中的 Double-free 崩溃

当将std::vector移动到lambda表达式中并且lambda表达式抛出异常时,我在clang8.0上因双重释放而崩溃。来自其他编译器(如gcc或clang7)的可执行文件运行无误。我是否在我的代码中做了一些非法的事情?templatevoidmyExecute(F&&f){f();}intmain(){try{std::vectortest={0.0,1.0};myExecute([v=std::move(test)](){throwstd::runtime_error("exception");});}catch(conststd::exception&e){std::cou

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

c++ - clang++/g++/gfortran之间的简单测试用例

我在scicomp上遇到了这个问题这涉及计算总和。在那里,你可以看到c++和类似的fortran执行。有趣的是,我看到Fortran版本的速度提高了大约32%。我想,我不确定他们的结果,并试图重振局面。这是我运行的(非常轻微的)不同代码:C++#include#include#include#includeintmain(){constdoublealpha=1;std::cout.precision(16);std::complexsum=0;conststd::complexa=std::complex(1,1)/std::sqrt(2.);for(unsignedintk=1;k

c++ - 如何在 clang++ 中禁用自动 "pass by pointer"优化?

我有一个函数voidX(Objecto){....}当我编译它时,我看到clang将其签名更改为voidX(Object*o)这很不方便,因为我直接从一些llvmIR代码中使用这个函数。如何禁止它做这个优化?编辑:最小工作示例:#includeclassObject{public:Object();~Object();int*pointer;};voidFunction(Objecto){o.pointer=0;}intmain(){Objecta;Function(a);return0;}通过以下命令行:clang++tst.cpp-emit-llvm-O0tst.cpp-S-std

c++ - 是可调用和模糊调用 : bug in either g++ or clang

考虑以下代码://Preamble#include#include//Abaseclasstemplatestructbase{voidoperator()(T){};};//Twoderivedclassesinheritingfromthesamebaseclassestemplatestructderived1:base...{usingbase::operator()...;};templatestructderived2:base...{usingbase::operator()...;};//Aclassinheritingfrombothderived1andderive

c++ - 获取 clang 格式以将多行函数调用的右括号放在单独的行上?

我一直在使用clang格式来帮助保持我的代码整洁。对于多行函数调用,有什么方法可以让clang将右括号放在它自己的行上?示例:它现在在做什么:increment_and_call_on_match(clique_colors,0,max_clique_color,[&](intclique_color){comms.emplace_back(context.split_by_color(clique_color));},[&](int){context.split_by_color();});我想要的:increment_and_call_on_match(clique_colors,

c++ - 如何以 clang 格式强制使用 east const?

是否有clang格式的标志将“constwest”更改为“eastconst”,以便以下内容:voidfun(conststd::string&s);将被重新格式化为:voidfun(std::stringconst&s); 最佳答案 从Clang-Format14开始,有QualifierAlignment。将以下行添加到您的.clang-format配置文件中:QualifierAlignment:Right 关于c++-如何以clang格式强制使用eastconst?,我们在Sta

c++ - clang 6 和 clang 7 模板转换运算符区别

我有一些代码使用模板转换运算符来查找通过ADL找到的函数的返回类型。简化后的代码如下所示:#includetemplatestructprobe{template::value&&!std::is_const::value,int>=0>operatorT&();template::value&&!std::is_const::value,int>=0>operatorT&&();template::value,int>=0>operatorTconst&()const;template::value,int>=0>operatorTconst&&()const;};namespace