C++ C++;快速修复在显式地将模板参数指定给运算符()时前端ICE发出的叮当声? 当显式调用尚未修复时,我们可以使用什么快速修复方法::operator()? LLVM错误报告中报告的问题:

C++ C++;快速修复在显式地将模板参数指定给运算符()时前端ICE发出的叮当声? 当显式调用尚未修复时,我们可以使用什么快速修复方法::operator()? LLVM错误报告中报告的问题:,c++,c++17,c++20,clang++,C++,C++17,C++20,Clang++,考虑以下最小复制案例示例: #包括 int main() { //KO,显式模板参数 常数自动lambda_1=[](){}; [&lambda_1](标准::元组){ ((lambda_1.template操作符()),…); }(std::tuple{}); //好的,使用参数 常数自动lambda_2=[](T){}; [&lambda_2](标准::元组){ ((lambda_2(Ts{})),…); }(std::tuple{}); } 这里的问题是,这种解决方案要求Ts..是默认可

考虑以下最小复制案例示例:

#包括
int main()
{
//KO,显式模板参数
常数自动lambda_1=[](){};
[&lambda_1](标准::元组){
((lambda_1.template操作符()),…);
}(std::tuple{});
//好的,使用参数
常数自动lambda_2=[](T){};
[&lambda_2](标准::元组){
((lambda_2(Ts{})),…);
}(std::tuple{});
}
这里的问题是,这种解决方案要求
Ts..
是默认可构造的

因此,它不适用于不是的类型,例如带有存储的lambda,
例如:

//KO,Ts。。。不是默认可构造的
常数auto lambda=[](T){};
int i{0};
[&lambda](标准::元组){
((lambda(Ts{})),…);
}(std::tuple){
[i] (){}
});
问题
  • 我们是否被迫暂时禁用对项目的Clang支持,并等待修补程序,
    或者,在下一个版本(将修复此ICE)之前,我们是否可以使用任何快速修复来使此工作正常进行
一个“标记”结构可能有助于传递类型并允许扣除:

template <typename T>
struct Tag
{
    using type = T;
};
// or
// template <typename T> using Tag = std::type_identity<T>;
模板
结构标签
{
使用类型=T;
};
//或
//使用Tag=std::type_identity的模板;
而不是:

const auto lambda_1 = []<typename T>(){/*...*/};
lambda_1.template operator()<SomeT>();
const auto lambda_1=[](){/*…*/};
lambda_1.template运算符();
您可能有:

const auto lambda_2 = []<typename T>(Tag<T>){ /*...*/};
lambda_2(Tag<SomeT>{});

// C++14: No constraints on tag
const auto lambda_3 = [](auto tag){ using T = typename decltype(tag)::type; /*...*/ };
lambda_3(Tag<SomeT>{});
const auto lambda_2=[](标记){/*…*/};
lambda_2(Tag{});
//C++14:标记上没有约束
const auto lambda_3=[](自动标记){using T=typename decltype(标记)::type;/*…*/};
lambda_3(Tag{});

你说得对。这是A. Alexandrescu <代码> Type 2> 设计BTW,回到“现代C++设计”的旧时代。这取决于你想要保留的部分,你可以用一个旧的方法函数替换LAMBDA。