另一个“在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,也可以使用8.0.0,根据Wandbox)编译和运行,但是使用clang++ (3.9.1,也可以使用6.0.0,根据Wandbox)编译它,我得到了以下错误
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++?
发布于 2018-05-24 11:14:10
Clang是正确的,但有一个微妙的原因:在模板推导过程中允许重载集,但deduction on that one argument必须能够选择其中之一才能推导出任何内容。(如果零匹配,则整个演绎失败;如果有多个匹配,则演绎将忽略该参数。)在这里,两个foo都匹配R(*fn)(T),因此无法从该参数推导出R (即使它们都同意这一点),因此根本就不是。
https://stackoverflow.com/questions/45399735
复制相似问题