用函数模板推导出返回类型

cig*_*ien 6 c++ language-lawyer

考虑以下程序:

#include<functional>

template<typename T>
T f() { return T{}; }

template<typename T>
auto g() { return T{}; }

int main() { 
    std::function<int()> a = f<int>;  // ok, clang and gcc
    std::function<int()> b = g<int>;  // ok, clang, error gcc
}
Run Code Online (Sandbox Code Playgroud)

gcc 中的错误是

error: conversion from '<unresolved overloaded function type>' to non-scalar type 'std::function<int()>' requested
Run Code Online (Sandbox Code Playgroud)

这是要试验的代码

我不明白为什么程序仅在返回类型为 时才编译T,并且在推导返回类型时在 gcc 上失败。

编辑:评论表明这是一个 gcc 错误,但我可以确认该程序确实格式良好吗?

Fed*_*dor 1

事实上,f()g()是类似的函数,具有相同的结果类型。

这只是 GCC 中的一个错误,已在 GCC 10.3 中修复。Clang和MSVC也接受该程序,演示: https: //gcc.godbolt.org/z/qPvar6vTh

所以该程序的结构良好。