首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >g++和clang++推断函数的模板返回类型的不同行为

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

Stack Overflow用户
提问于 2017-07-30 20:17:30
回答 1查看 213关注 0票数 10

另一个“在g++和clang++之间谁是对的?”针对C++标准专家的问题。

下面的程序

代码语言:javascript
运行
复制
#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)编译它,我得到了以下错误

代码语言:javascript
运行
复制
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++?

EN

回答 1

Stack Overflow用户

发布于 2018-05-24 11:14:10

Clang是正确的,但有一个微妙的原因:在模板推导过程中允许重载集,但deduction on that one argument必须能够选择其中之一才能推导出任何内容。(如果零匹配,则整个演绎失败;如果有多个匹配,则演绎将忽略该参数。)在这里,两个foo都匹配R(*fn)(T),因此无法从该参数推导出R (即使它们都同意这一点),因此根本就不是。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45399735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档