【问题标题】:Inline Lambda variable vs Inline function vs Inline template function with automatic type deduction内联 Lambda 变量 vs 内联函数 vs 带有自动类型推导的内联模板函数
【发布时间】:2021-08-07 10:24:23
【问题描述】:

假设我想声明一个内联函数,它将接受任意类型的参数。 我认为可以通过以下方式实现。

//////
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);    
}

所以我有几个问题。

  1. 我的定义是否有任何错误,是否支持这些定义?
  2. 这些定义中的任何一个都比另一个有什么优势,如果有,有什么优势?
  3. 就代码质量而言,这些定义中哪一个更好?

提前致谢。

【问题讨论】:

  • 请每个问题回答一个问题。 1)你可以通过编译来回答
  • 你不可能有一个 inline 变量直接用带有(非初始化)捕获的 lambda 初始化(只能出现在函数内部)。

标签: c++ templates c++17 inline c++20


【解决方案1】:

他们都 3 定义了一些截然不同的东西。因此,对 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&amp;。因此第一个更类似于 lambda(更准确地说,类似于它的operator()),因为返回类型是从something(val) 推导出来的,尽管 lambda 还通过&amp; 捕获。使用函数无法轻松做到这一点。

【讨论】:

  • 我担心将struct 作为函数参数传递。只要它被标记为inline,它应该在编译时扩展成一行(如this文章中所述),那么在将它作为参数传递时会导致任何复杂性吗?
  • @KarenBaghdasaryan 那篇文章非常具有误导性。你可以在这里阅读例如en.cppreference.com/w/cpp/language/inline 关于“内联函数”的实际含义。在古代inline 是告诉编译器函数调用应该被内联,但现在不是这样了。令人困惑的是,关键字及其大部分含义仍然相同,但 不 决定编译器是否应按照那篇文章的建议内联调用。
  • @KarenBaghdasaryan 例如,从 c++17 开始:“因为函数的关键字 inline 的含义意味着“允许多个定义”而不是“首选内联”,所以该含义得到了扩展到变量。"
  • @KarenBaghdasaryan 一般来说,我不能推荐 geeksforgeeks 作为学习 C++ 的资源。不幸的是,这种错误信息是该网站的规则而不是例外
  • @463035818_is_not_a_number:请注意,C++20 模块可能会恢复 inline 的某些含义,因为有(非绑定)ABI 原因可以避免内联非inline 函数,并且不需要内联变量。
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 2011-12-16
  • 2011-12-30
  • 1970-01-01
  • 2020-06-02
  • 2014-02-08
  • 2018-02-08
相关资源
最近更新 更多