![](/img/trans.png)
[英]g++ and clang++ different behaviour with pointer to variadic template functions
[英]g++ and clang++ different behaviour inferring the template return type of a function
另一个“g ++和clang ++之间谁是正确的?” C ++标准大师的问题。
以下程序
#include <iostream>
void foo (int v)
{ std::cout << "foo(), int version (" << v << ')' << std::endl; }
void foo (double v)
{ std::cout << "foo(), double version (" << v << ')' << std::endl; }
template <typename T, typename R>
void bar (T v, R(*fn)(T))
{ fn(v); }
int main ()
{ bar(1, foo); }
使用g ++编译和运行(6.3.0,但根据Wandbox也使用8.0.0)但是用clang ++编译它(3.9.1,但根据Wandbox也是6.0.0)我得到以下错误
tmp_002-11,14,gcc,clang.cpp:29:4: error: no matching function for call to 'bar'
{ bar(1, foo); }
^~~
tmp_002-11,14,gcc,clang.cpp:25:6: note: candidate template ignored: couldn't
infer template argument 'R'
void bar (T v, R(*fn)(T))
^
1 error generated.
像往常一样,问题是:谁是对的? g ++或clang ++?
Clang是正确的,但是由于一个微妙的原因:在模板推导期间允许重载集,但是对该一个参数的推论必须能够选择其中一个来推导出任何东西。 (如果零匹配,则整体推论失败;如果多于一个,则推论忽略该参数。)这里,两个foo
匹配R(*fn)(T)
,因此R
不能从该参数推导出来(即使它们会双方都同意,因此根本没有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.