变体访问过载技巧在gcc中不起作用

时间:2018-10-21 19:03:58

标签: c++ gcc c++17

我在使用gcc中here中所述的变体访问过载技巧时遇到了麻烦。我在编译器资源管理器上尝试了不同的版本,但没有一个起作用。另一方面,最新的clang版本接受它。

template <class... Fs>
struct overload : Fs...
{
    template <class... Ts>
    overload(Ts&& ...ts) : Fs{std::forward<Ts>(ts)}... {}

    using Fs::operator()...;
};

template <class... Ts>
overload(Ts&&...) -> overload<std::remove_reference_t<Ts>...>;


int main()
{
    auto visitor = overload(
        [](int) { },
        [](double) { }
    );
}

给予

<source>: In instantiation of 'overload<Fs>::overload(Ts&& ...) [with Ts = {func()::<lambda(int)>, func()::<lambda(double)>}; Fs = {}]':
<source>:21:13:   required from here
<source>:7:52: error: mismatched argument pack lengths while expanding 'Fs'

     overload(Ts&& ...ts) : Fs{std::forward<Ts>(ts)}...
                                                    ^~~
Compiler returned: 1

gcc似乎在模板推导指南上遇到了麻烦。

编辑:我发现用这样的功能模板代替了演绎指南

template <class... Ts>
overload<std::remove_reference_t<Ts>...> overloaded(Ts&& ...ts)
{
    return overload<std::remove_reference_t<Ts>...>(ts...);
}

可行,但是如果推导指南有问题还是gcc错误,我会感兴趣吗?

0 个答案:

没有答案