通用lambda和继承可能的g ++错误

时间:2017-09-08 16:12:44

标签: c++ lambda g++ c++14

我尽可能地减少了我的用例(使用可变参数模板和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;};
                   ~~^~~~

0 个答案:

没有答案