C++11 作为函数参数和模板的init list重载解析的语义错误

C++11 作为函数参数和模板的init list重载解析的语义错误,c++11,llvm,eclipse-cdt,initializer-list,template-argument-deduction,C++11,Llvm,Eclipse Cdt,Initializer List,Template Argument Deduction,我已经将EclipseCDT(EclipseV4.5.0,构建id 20150621-1200;CDTv8.7.0.201506070905)配置为在C++11的连续构建过程中使用,但某些表达式仍然会导致语义错误,即使它们使用g++4.9.2和clang++3.8.0正确编译。也就是说,作为函数参数提供的带括号的init列表与参数对应的std::initializer_list构造函数不匹配,LLVM的cast函数的正确版本也与其提供的参数不匹配。EclipseCDT使用的是不支持此类C++11

我已经将EclipseCDT(EclipseV4.5.0,构建id 20150621-1200;CDTv8.7.0.201506070905)配置为在C++11的连续构建过程中使用,但某些表达式仍然会导致语义错误,即使它们使用g++4.9.2和clang++3.8.0正确编译。也就是说,作为函数参数提供的带括号的init列表与参数对应的
std::initializer_list
构造函数不匹配,LLVM的
cast
函数的正确版本也与其提供的参数不匹配。EclipseCDT使用的是不支持此类C++11功能的较旧的内部解析器,而不是委托给更现代的外部GCC工具链(它会检测到)吗

#包括“llvm/ADT/ArrayRef.h”
#包括“llvm/ADT/SmallVector.h”
#包括“llvm/IR/DerivedTypes.h”
#包括“llvm/IR/Function.h”
#包括“llvm/IR/Module.h”
#包括“llvm/IR/Type.h”
使用名称空间llvm;
//i32@myFunc1(i32,i32),i32@myFunc2(i32,i32)
SmallVector getMyFuncs(模块&M){
Type*i32=Type::getInt32Ty(M.getContext());
//报告错误#1
FunctionType*FT=FunctionType::get(i32,{i32,i32},false);
//报告错误#2
Function*F1=cast(M.getOrInsertFunction(“myFunc1”,FT));
//此处ArrayRef(const std::initializer_list&)的隐式匹配没有错误
ArrayRef ArgTypes={i32,i32};
FT=FunctionType::get(i32,ArgTypes,false);
//报告错误#2
函数*F2=cast(M.getOrInsertFunction(“myFunc2”,FT));
//此处SmallVector(std::initializer_list)的隐式匹配没有错误
返回{F1,F2};
}
错误#1

无效参数“
候选人是:
llvm::FunctionType*get(llvm::Type*,llvm::ArrayRef,bool)
llvm::FunctionType*get(llvm::Type*,bool)

错误#2

无效参数“
候选人是:
llvm::cast_retty::ret_type cast(#1*)std::enable_if::ret_type>::type cast(const#1&)
llvm::cast_retty::ret_类型cast(#1&)
"


EclipseCDT包含自己的C/C++解析器,它不使用任何外部的东西。因此,简单地升级编译器不会带来任何新的Eclipse完成。

Eclipse CDT使用一个内部C++分析器称为<代码> CODAN < /COD> 可以连续报告其认为的语法或语义错误, 不仅仅是在构建时。它还可以诊断它认为是什么或静态分析 问题

<> > CODAN C++的掌握是过时的W.R.T到您的代码和编译器, 然后您的代码将编译,尽管
codan
s抱怨。在问题选项卡中 在显示诊断的IDE底部,您可以区分
codan
来自编译器的抱怨。编译器抱怨将始终分类在 将列键入为C/C++问题。
codan
gripe的类型 识别codan的问题类别之一,例如语义错误, 代码分析问题

另一种降低误报率的方法是查看
控制台
选项卡,而不是生成后的问题选项卡。控制台选项卡报告
工具链的输出

但是,当编译器是正确的,并且
codan
是最新的,并且仍然是错误的时,您就不需要它的诊断代码了 噪音正如您所希望的,您可以配置
codan
以抑制它:-

  • 浏览属性->C/C++常规->代码分析
  • 启用使用项目设置
  • 向下滚动问题树控件至类别 语法和语义错误
  • 滚动到子类别无效参数(这是 您的错误#1和错误2)中引用的投诉
  • 通过取消选中该子类别的复选框并确定,禁用该子类别
然后,错误#1和错误2应该在下次 此时将刷新“诊断”选项卡

如果您无法通过禁用来抑制所有
codan
的错误诊断 一些语法和语义错误可以禁用整个类别
让编译器找到你的编译错误,老派。

我希望它不会要求这样做,因为我真的喜欢在我使用错误的参数时立即得到通知,但是,如果没有简单的方法来更新
codan
我想如果我想继续使用Eclipse,使用现代语法,并且没有错误报告,那么这是唯一可以做的事情。哦,取消选中无效参数并不能关闭错误#2,这需要取消选中符号才能解决,如果使用
auto
而不是实际类型,则会导致方法解析错误(因为分析器无法判断返回值是否基于模板类型)。真烦人。