gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:23:50 26 4
gpt4 key购买 nike

另一个“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++(根据 Wandbox,3.9.1,也使用 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 是正确的,但有一个微妙的原因:在模板推导期间允许重载集,但是 deduction on that one argument必须能够选择其中之一才能推断出任何内容。 (如果零个匹配,则整体推导失败;如果多个匹配,推导将忽略该参数。)这里,两个 foo 都匹配 R(*fn)(T) ,所以 R 不能从该论证中推导出来(即使他们都同意),因此根本不能。

关于c++ - g++ 和 clang++ 推断函数模板返回类型的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45399735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com