自动返回功能和模板实例化

时间:2018-02-12 04:41:49

标签: c++ c++14

在编写一些模板代码时,我遇到了<unresolved overloaded function type>错误,这些错误可以简化为以下内容。

template <int N>
auto bar()
{
    return N;
}

int main(int, char* [])
{
    auto foo = [] (auto func) {
            return func();
        };

    foo(bar<3>);
}

错误是:

unresolved_overload.cpp: In function 'int main(int, char**)':
unresolved_overload.cpp:26:28: error: no match for call to '(main(int, char**)::<lambda(auto:1)>) (<unresolved overloaded function type>)'
     std::cout << foo(bar<3>) << std::endl;
                            ^
unresolved_overload.cpp:21:29: note: candidate: template<class auto:1> constexpr main(int, char**)::<lambda(auto:1)>::operator decltype (((const main(int, char**)::<lambda(auto:1)>*)((const main(int, char**)::<lambda(auto:1)>* const)0))->operator()(static_cast<auto:1&&>(<anonymous>))) (*)(auto:1)() const
     auto foo = [] (auto func) {
                             ^
unresolved_overload.cpp:21:29: note:   template argument deduction/substitution failed:
unresolved_overload.cpp:26:28: note:   couldn't deduce template parameter 'auto:1'
     std::cout << foo(bar<3>) << std::endl;
                            ^
unresolved_overload.cpp:21:29: note: candidate: template<class auto:1> main(int, char**)::<lambda(auto:1)>
     auto foo = [] (auto func) {
                             ^
unresolved_overload.cpp:21:29: note:   template argument deduction/substitution failed:
unresolved_overload.cpp:26:28: note:   couldn't deduce template parameter 'auto:1'
     std::cout << foo(bar<3>) << std::endl;

如果我们用显式返回类型int替换自动返回,示例将编译正常。

为什么自动返回会遇到这些问题?我查看了模板参数推导和替换,但搜索基本上没有用。我认为它可能与模板实例化/等等的顺序有关,但是对它没有多大意义......

2 个答案:

答案 0 :(得分:2)

Per AndyG的建议,我在GCC的错误列表中发现了同样的问题。 Bug 64194。首先在2014年报告。因此结论似乎是这是一个GCC错误,幸好不是另一个模板的特殊情况。

解决这个问题只需要用其他东西来触发实例化(例如分配给变量,using声明)。

答案 1 :(得分:0)

试试这个:

template <typename func>
auto bar(func&& f)->decltype(f())
{   
    return f();
}


int main()
{
    int i = 100;
    auto f = [=]()
    {
      return i;
    };

    bar(f);

    return 0;
 }