是否可以通过从lambda的引用中返回T型对象,而无需使用尾随返回类型语法
Is it possible to return an object of type T by reference from a lambda without using trailing return type syntax?
给定以下代码段:
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); };
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 截至 C++14 起尾随返回类型语法的合法使用
- 返回类型布尔函数中的声明语法错误
- 是否可以在尾随返回类型语法中直接使用参数值(不是其类型,而是值本身)
- 嵌套模板类返回类型在 C++ 中的头文件中函数返回类型的语法
- GCC 中的编译器错误,但在将 decltype 与具有尾随返回类型语法的模板化成员函数一起使用时没有 clang
- 是否可以通过从lambda的引用中返回T型对象,而无需使用尾随返回类型语法
- 在后面的返回类型函数语法中,auto关键字背后是否有意图
- 由于noexcept说明符,尾随返回类型语法失败