为什么这段代码用gcc编译而不用clang编译

时间:2016-05-27 22:16:34

标签: c++ c++11 g++ clang++

此代码与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}}

1 个答案:

答案 0 :(得分:4)

我认为此代码不正确。在这种情况下,Log的函数参数不能用于模板参数推导,因为参数是非推导的上下文。

从标准中的[temp.deduct.type],p5列出了非推断的上下文,p5.5说:

  

无法进行参数推导的函数参数   因为关联的函数参数是一个函数或一组   重载函数(13.4),以及以下一个或多个适用:

和p5.5.3说:

  

作为参数提供的函数集包含一个或多个   功能模板。

我的解释是你有一个函数参数,函数参数是函数的一个(指向),函数是函数模板。

可以说,因为这不是一个过载集,这可能是将来可以允许的,但我读标准并不能保证这种技术可行。