函数模板和lambda表达式之间的差异

tom*_*myk 2 c++ lambda templates auto

// (1)
template<typename T>
T add1(T a, T b)
{
    return a + b;
}

// (2)
auto add2 = [](auto a, auto b) 
{ 
    return a + b; 
};
Run Code Online (Sandbox Code Playgroud)

在这个简单的例子中,我想知道哪个实现更好:

  • 代码大小(在过去的模板中用于导致"代码膨胀")
  • 执行速度(非平凡函数体有什么区别吗?)
  • 内联友好(在一个非平凡的函数体的情况下,哪个变体更可能被内联?)

Bar*_*rry 5

所以回想一下,泛型lambda基本上定义了一个函数模板operator(),所以第二个版本基本上是:

struct __some_uniq_name
{
    template<typename T, typename U>
    auto operator()(T a, U b) const
    {
        return a + b;
    }
} add2;
Run Code Online (Sandbox Code Playgroud)

这里的代码与add1*中的代码相同,除了一个是局部变量中的成员函数,另一个是自由函数模板.性能,代码大小或内联能力应该没有区别(但总是,测试测试!) - 唯一的区别是你可以在哪里使用.需要在很多地方添加东西吗?使用add1.需要在一个特定的位置使用它吗?使用add2.

*除了它允许你添加不同类型的对象,所以如果你需要这样做,你只有一个选项.