推导出具有默认模板参数的模板函数指针的模板参数

zou*_*yjs 6 c++ templates language-lawyer c++17 c++20

虽然这个问题似乎有点令人困惑。代码很简单:

template <typename T>
void tfunc(T&& getter)
{

}

template <typename T = void>
void voidfunc()
{}

int main() {
    tfunc(&voidfunc);   // error: could not deduce template argument for 'T'
    tfunc(&voidfunc<int>); // ok
    voidfunc(); // calling using default template parameter is ok.
}
Run Code Online (Sandbox Code Playgroud)

clang 11 和 msvc Visual Studio 2019 16.7 都抱怨错误。为什么我需要明确指定模板参数。

背景

  • 该参数是一个虚拟参数,只是为了延迟voidfunc到使用它的地方的实例化。类型并不重要。
  • &voidfunc由 clangAST 生成的一些代码使用,否则我需要调整生成器来编写&voidfuc<>它是否是模板。
  • __declspec(property(put=voidfunc))然而,这个 clang/msvc 扩展需要voidfunc但不是voidfunc<>

&voidfunc<>如果给定的函数是模板,我已经调整了生成器以输出@Jarod42 所说的。它现在有效。

Dav*_*ing 2

正如评论中所述,这种情况在标准中并没有明确,直到 C++20,它被清理以更好地支持约束函数的新特性。新规范在以前的语言版本中有意义(忽略约束的可能性),因此希望实现最终能够在任何地方支持这种用法。