假设我想声明一个内联函数,它将接受任意类型的参数。我认为可以通过以下方法来做到这一点。
//////
inline auto const myfunc = [&](const auto& val){return something(val);};
//////
inline auto myfunc(const auto& val)
{
return something(val);
}
//////
template<class T>
inline T myfunc(const T& val)
{
return something(val);
}所以我有几个问题。
我的定义中是否有任何错误,这些定义supported?
提前谢谢。
发布于 2021-08-07 10:28:57
它们都定义了一些与众不同的东西。因此,对2的回答是:选择一个做你想做的事情。1)我会告诉你的,因为你可以很容易地试一试,看看它们是否编译。( 3)不相关吗,因为在两者之间做出选择是你真正需要的,而不是风格的问题。
inline auto const myfunc = [&](const auto& val){return something(val);};lambda myfunc是一些未命名的类型,具有模板化的operator()。myfunc本身没有模板化。您可以将myfunc传递给其他函数,因为它是一个对象。对另外两个人来说,你不能轻易做到这一点。
之间的区别
inline auto myfunc(const auto& val)
{
return something(val);
}和
template<class T>
inline T myfunc(const T& val)
{
return something(val);
}是返回类型。对于第二个类型,返回类型是T。T要么是从参数推导出来的,要么是您显式地指定它,然后它可以与传递的参数不同,只要参数可以转换为const T&。因此,第一个更类似于lambda (更准确地说,是它的operator()),因为返回类型是从something(val)推导出来的,尽管lambda还通过&捕获。对于函数来说,这样做是不容易的。
https://stackoverflow.com/questions/68691471
复制相似问题