草庐IT

clang_complete

全部标签

c++ - 'using' 语句用 g++ 编译,用 clang 编译失败

我有以下结构的代码(在现实中当然要复杂得多,尤其是“Base”是三行代码,但我试图捕获它的要点):templateclassA{};templateclassB{public:B(){};};templateclassC:publicB>{public:usingBase=B>;usingBase::B;};staticconstCc{};代码可以通过g++正常编译g++-ctest.cpp-std=c++11但是,使用clang++我收到一条我不太理解的错误消息clang++-ctest.cpp-std=c++11test.cpp:14:14:error:dependentusing

c++ - 使用模板调用运算符和通用 lambda 重载结构 - gcc vs clang

我发现了一个代码片段,它可以在clang++4(和主干)中正常编译和工作,但在g++7(和主干)中无法编译。假设我有以下struct类型:structa{voidfoo(){}};structb{voidbar(){}};structc{voidbar(){}};我想用lambda创建一个重载集,它显式处理a,而b和c被使用auto参数的通用lambda“捕获”:autool=overload([](ax){x.foo();},[](autox){x.bar();})当我调用ol(a{})时:clang++编译并按预期运行:a“匹配”第一个lambda,而b和c匹配第二个。g++编译失

c++ - 如何使 C++(共享)库与 clang 和 GCC 兼容?

我已经编写了相当丰富的C++11库,并且我计划允许从我的网站下载预编译版本。所以我设置了一个自动构建,它使用clang编译库并使其可供下载,但这暴露了一个问题:如果我尝试将clang编译的库与GCC一起使用,我会得到undefinedreference(主要是与std::string相关)。我认为这与GCC5.1中的GCC双ABI更改有关,但我不确定如何修复它。我的问题是,为了使C++库与clang和GCC兼容,我应该设置什么标志,或者我应该遵循什么做法?或者我应该放弃并编译两个单独的库吗? 最佳答案 正如在几个地方(例如here)

c++ - clang 交错源代码和程序集

想知道是否可以从clang生成交错的源代码和程序集?我正在寻找等同于gcc命令的东西(如http://www.fclose.com/240/generate-a-mixed-source-and-assembly-listing-using-gcc/所示)gcc-Wa,-adhln-gsource_code.c>assembly_list.s我访问过链接:HowdoyougetassembleroutputfromC/C++sourceingcc?但它甚至列出了程序集-但没有交错。此外,VisualStudio确实为您提供了相当不错的交错汇编输出,详情请参见:Howtoviewthea

c++ - 让 clang-tidy 修复头文件

我正在将当前使用gcc编译的项目移动到clang,并且有一堆gcc没有生成的警告(-Winconsistent-missing-override)。clang-tidy用于修复*.cpp文件中的这些错误,但是它不会触及hpp文件,因为编译命令是'在数据库中找到(如我所料)。我正在使用ninja构建项目,并使用ninja-tcompdbcccxx>.build/compile_commands.json生成编译数据库。我试过运行:clang-tidy-3.6-p.build/\$(findsrc/-name*.cpp)\$(findsrc/-name*.hpp)\--checks=mis

c++ - 使用别名模板时无法将 `std::unique_ptr` 分配给 clang 中的基类

以下代码在gcc4.9.3和clang3.7.1上编译和运行得很好//std::unique_ptr#include//Templateclassfortemplate-templateargumentstemplatestructBar{};//BaseclasstemplateclassXX>structBase{};//DerivedclassthatoperatesonlyonBartemplatestructDerived:publicBase{};//Holdstheunique_ptrtemplateclassXX>structFoo{std::unique_ptr>fo

c++ - 列出引用 : is GCC or Clang correct? 的初始化

给出这个例子:intg_i=10;structS{operatorint&(){returng_i;}};intmain(){Ss;int&iref1=s;//implicitconversionint&iref2={s};//clang++error,g++compilesfine://`s`isconverted//toatemporaryintandbindswith//lvaluereferenceint&&iref3={s};//clang++compiles,g++error://cannotbindrvaluereference//tolvalue}错误如注释中所述。gc

c++ - 为什么在 C++1z 的这个例子中,clang 和 g++ 为 a1.v 和 a2.v 打印 0?

请参阅[class.base.init]/11中的示例structA{A()=default;//OKA(intv):v(v){}//OKconstint&v=42;//OK};Aa1;//error:ill-formedbindingoftemporarytoreferenceAa2(1);//OK,unfortunatelyclang和g++都编译代码(clang带有警告),但我想了解为什么它们为成员a1.v打印0和a2.v?参见demo. 最佳答案 他们打印0并不重要。对于a1,初始化的格式不正确。对于a2,您将引用绑定(bi

c++ - clang/g++ 与友元函数的区别

为什么下面的代码在g++中编译良好,但在clang上却出错?#includeclassObject{};classPrint{public:templateinlinefriendstd::basic_ostream&operator&out,constObject&){return(out证明链接:g++/clang++当我将友元函数移动到全局命名空间时,代码为两个编译器编译得很好(clang++/g++)。在这种情况下,哪种实现更符合C++标准? 最佳答案 Clang在这里是正确的。在类内部定义的友元函数只能通过对其参数使用参数

c++ - clang 提示 constexpr 函数以防 switch 语句

structX{enumclassE{A,B};staticconstexprXA(){returnX{E::A};}staticconstexprXB(){returnX{E::B};}constexproperatorE()const{returna;}Ea;};templatestructY{voidf(){//withoutthislineclangerrs//constauto&x=this->x;switch(x){caseX::A():caseX::B():default:return;}}Xx=X::A();};intmain(){Y{}.f();}如果片段中没有标记行