首页 > 解决方案 > 推导显式特化的函数模板类型

问题描述

以下代码中,GCC 无法编译(1)(无法推断F),但成功编译(2)。这里的关键点是bar模板推导出的返回类型,否则 GCC 不会失败。

但是,Clang 编译整个代码没有错误。

b除了作为函数指针之外,在这种情况下,(1) 和 (2) 之间的本质区别是什么?它是 GCC 中的错误,还是这里有一些不正确的东西?

template<class>
auto bar() {
    return 0;
}

template<class F>
void foo(F&&) {
}

int main () {
    foo(bar<int>); // (1)

    auto b = bar<int>;
    foo(b);  // (2)
}

标签: c++gccc++14language-lawyertype-deduction

解决方案


是的,这是一个已经存在一段时间的 GCC 错误:https ://gcc.gnu.org/bugzilla/show_bug.cgi?format=multiple&id=64194


推荐阅读