代码之家  ›  专栏  ›  技术社区  ›  Baum mit Augen

函数指针数组的类模板参数推导适用于clang,但不适用于gcc

  •  7
  • Baum mit Augen  · 技术社区  · 6 年前

    以下代码:

    #include <array>
    
    template <int i>
    auto f(){}
    
    int main () {
        std::array{f<5>};
    }
    

    编译clang 7.0,但在GCC 8.2中失败,并显示消息

    prog.cc: In function 'int main()':
    prog.cc:7:20: error: class template argument deduction failed:
         std::array{f<5>};
                        ^
    prog.cc:7:20: error: no matching function for call to 'array(<unresolved overloaded function type>)'
    In file included from prog.cc:1:
    /opt/wandbox/gcc-8.2.0/include/c++/8.2.0/array:244:5: note: candidate: 'template<class _Tp, class ... _Up> std::array(_Tp, _Up ...)-> std::array<typename std::enable_if<(is_same_v<_Tp, _Up> && ...), _Tp>::type, (1 + sizeof... (_Up))>'
         array(_Tp, _Up...)
         ^~~~~
    /opt/wandbox/gcc-8.2.0/include/c++/8.2.0/array:244:5: note:   template argument deduction/substitution failed:
    prog.cc:7:20: note:   couldn't deduce template parameter '_Tp'
         std::array{f<5>};
                        ^
    In file included from prog.cc:1:
    /opt/wandbox/gcc-8.2.0/include/c++/8.2.0/array:94:12: note: candidate: 'template<class _Tp, long unsigned int _Nm> array(std::array<_Tp, _Nm>)-> std::array<_Tp, _Nm>'
         struct array
                ^~~~~
    /opt/wandbox/gcc-8.2.0/include/c++/8.2.0/array:94:12: note:   template argument deduction/substitution failed:
    prog.cc:7:20: note:   couldn't deduce template parameter '_Tp'
         std::array{f<5>};
                    ^
    

    此代码合法吗?如果没有,我该如何修复?

    1 回复  |  直到 6 年前
        1
  •  4
  •   StoryTeller - Unslander Monica    6 年前

    我相信这个计划是成形的。我最近也遇到了类似的问题。在推导数组参数的过程中,当需要推导placehoder返回类型时,gcc似乎有问题。将返回类型显式指定为 void 例如,将使GCC接受您的代码。

    最终,解决方法是分割声明。

    auto *p = f<5>;
    std::array{p};