繁体   English   中英

g ++和clang ++不同的行为推断函数的模板返回类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM