是否可以通过从lambda的引用中返回T型对象,而无需使用尾随返回类型语法

Is it possible to return an object of type T by reference from a lambda without using trailing return type syntax?

本文关键字:语法 返回类型 对象 lambda 可以通过 引用 返回 是否      更新时间:2023-10-16

给定以下代码段:

struct T {}; 
std::function<T&(T&)> f = [](T& obj) -> T& { return obj; };

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

显然,如果我删除-> T&,则会发生编译时错误,因为推论类型为T

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

否,但是在C 14中,您可以将auto&用作 trailing-return-type 。如果您担心的是打字,并且编译器升级根本不用担心您,那么这主要解决了您的问题。

在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;
}

功能

template<class T>
std::reference_wrapper<T> std::ref(T& t)

返回一个Reference_wrapper对象,该对象基本上是持有指针的对象。可以将此参考包装器隐式转换为相应的参考,请参见cppreference.com

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

auto foo = [] (T& t) { return std::ref(t); };
相关文章: