是否可以通过lambda引用返回类型为T的对象而不使用尾随返回类型语法?

Fde*_*deF 25 c++ lambda c++11 trailing-return-type

给出以下代码段:

struct T {}; 

std::function<T&(T&)> f = [](T& obj) -> T& { return obj; };
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以在T&不使用尾随返回类型语法的情况下推断出正确的lambda返回类型(即).

显然,如果我删除,-> T&那么将发生编译时错误,推导类型将是T.

jsb*_*jsb 24

在C++ 14中,您可以使用[](T& obj) -> decltype(auto) { return obj; }.在这种情况下,返回类型f是从声明的类型推导出来的obj(即T&在这种情况下).


Lig*_*ica 21

没有,但在C++ 14可以使用auto&作为尾随收益型.如果它正在打字你担心,编译器升级根本不担心你,那么这主要解决了你的问题.

  • 为了完整起见,我要提到的是,标准说_lada返回类型是`auto`,如果提供和/或从return statements_推导出来,它将由尾随返回类型指定的类型替换.然后[dcl.spec.auto](http://eel.is/c++draft/dcl.spec.auto)完成剩下的工作. (3认同)

chr*_*zke 11

在C++ 11中,您可以使用函数std :: ref来实现您的要求:

#include <iostream>
#include <functional>

struct T {
  int mI = 0;
};

int main() {
  std::function<T&(T&)> foo = [](T&t) { return std::ref(t); };

  T tObj;
  T & tRef = foo(tObj);

  tRef.mI = 42;

  std::cout<<tObj.mI<<"\n"; // Returns 42
  std::cout<<tRef.mI<<"\n"; // Returns 42

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

功能

template<class T>
std::reference_wrapper<T> std::ref(T& t)
Run Code Online (Sandbox Code Playgroud)

返回一个reference_wrapper对象,它基本上是一个包含指针的对象.此引用包装器可以隐式转换为相应的引用,请参阅cppreference.com

此外,您可以替换std::function<T&(T&)>auto:

auto foo = [] (T& t) { return std::ref(t); };
Run Code Online (Sandbox Code Playgroud)

  • 但请注意,在最终的代码片段中(其中 `std::function&lt;T&amp;(T&amp;)&gt;` 被 `auto` 替换),`foo` 的返回类型是 `std::reference_wrapper&lt;T&gt;`,而不是`T&amp;`。正如您所说,它是隐式可转换的,但从技术上讲,它是一个不同的函数签名。 (2认同)