此代码与gcc / g ++和msvc完美配合,但与clang无关。 它一直在抱怨没有找到Log的匹配功能,发生了什么?
> error: no matching function for call to 'Log'
> auto r = Log(Call<int(int), int>)([](int x){
> ^~~ test7.cpp:15:5: note: candidate template ignored: couldn't infer template argument 'T' T (*Log( T (*FuncPtr)(Args...)
> ))(Args...)
> ^ 1 error generated.
错误:
{{1}}
答案 0 :(得分:4)
我认为此代码不正确。在这种情况下,Log
的函数参数不能用于模板参数推导,因为参数是非推导的上下文。
从标准中的[temp.deduct.type],p5列出了非推断的上下文,p5.5说:
无法进行参数推导的函数参数 因为关联的函数参数是一个函数或一组 重载函数(13.4),以及以下一个或多个适用:
和p5.5.3说:
作为参数提供的函数集包含一个或多个 功能模板。
我的解释是你有一个函数参数,函数参数是函数的一个(指向),函数是函数模板。
可以说,因为这不是一个过载集,这可能是将来可以允许的,但我读标准并不能保证这种技术可行。