gpt4 book ai didi

c++ - 函数模板作为成员 - GCC 与 CLANG

转载 作者:行者123 更新时间:2023-12-01 12:08:02 27 4
gpt4 key购买 nike

考虑以下代码:

#include <type_traits>
#include <utility>

template <typename F>
class function
{
public:
// using function_type = typename std::decay<F>::type;
using function_type = F;

function(F func)
: function_(func)
{
}

private:
function_type function_;
};

template <typename F>
function<F> make_function(F&& func)
{
return function<F>(std::forward<F>(func));
}

double f1(double)
{
return 0.0;
}

template <typename T>
T f2(T)
{
return T();
}

int main()
{
// works in both cases
make_function(f1);

// needs decay (with CLANG)
make_function(f2<double>);
}

类(class) function旨在成为任何 Callable 的简单包装器.代码用 GCC 编译得很好(我从 git 存储库中测试了 4.9.2 和 7.0.0 20160427)。然而,clang (3.5.0) 提示:
function.cpp:17:17: error: data member instantiated with function type 'function_type' (aka 'double (double)')
function_type function_;
^
function.cpp:55:2: note: in instantiation of template class 'function<double (double)>' requested here
make_function(f2<double>);

那么这是GCC的错误吗?为什么如果变量是参数(在 make_function 和构造函数中)而不是成员变量,它会起作用吗?衰减(注释掉)是否在正确的位置,或者我应该将其移入 make_function ?为什么我传递函数( f1 )或函数模板的显式实例化( f2 )会有所不同?

最佳答案

正如评论者指出的那样,这是 Clang 中的一个错误。

代码开始使用 GCC 4.7.1(甚至 4.7?)和 Clang 3.7 进行编译:参见 GodBolt .

关于c++ - 函数模板作为成员 - GCC 与 CLANG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37136944/

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