我尽可能地减少了我的用例(使用可变参数模板和boost :: variant)到以下代码:
struct A {};
auto l1 = [](A& a){}; // visit A
auto l2 = [](auto& n){n *= 2;};
using t1 = decltype(l1);
using t2 = decltype(l2);
struct overload_set : t1, t2
{
using t1::operator();
using t2::operator();
overload_set() : t1(l1), t2(l2) {}
};
void f()
{
overload_set visitor;
double x = 1.1;
visitor(x);
}
在线查看:https://godbolt.org/g/Vrtc2V
至少使用版本5.x,6.x和7.x(我可以在线测试)gcc --std = c ++ 14失败,并且在{{3上使用最新的gcc 8.0.0 }} 更改继承的顺序(首先从通用lambda继承)不能解决问题。
适用于clang和VS2015。
任何人都可以确认这是一个gcc bug吗? 我想这是一个已知的bug,因为它似乎已在gcc中修复。 链接到bugzilla非常感谢。
唯一的解决方法似乎是使lambda非泛型,这对我的用例来说是不行的.. :(
谢谢!
PS:无法理解的编译器错误是
required by substitution of 'template<class auto:1> <lambda(auto:1&)>::operator decltype (((const<lambda(auto:1&)>*)((const<lambda(auto:1&)>* const)0))->operator()(static_cast<auto:1&>(<anonymous>))) (*)(auto:1&)() const [with auto:1 = A]'
required from here
error: no match for 'operator*=' (operand types are 'A' and 'int')
auto l2 = [](auto& n){n *= 2;};
~~^~~~