[英]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; };
我想知道是否可以在不使用尾隨返回類型語法的情況下推斷出正確的lambda返回類型(即T&
)。
顯然,如果我刪除-> T&
然后將發生編譯時錯誤,因為推導的類型將是T
在C ++ 14中,您可以使用[](T& obj) -> decltype(auto) { return obj; }
[](T& obj) -> decltype(auto) { return obj; }
。 在這種情況下, f
的返回類型是從聲明的obj
類型推導出來的(即在這種情況下為T&
)。
不,但在C ++ 14中,您可以使用auto&
作為尾隨返回類型 。 如果它正在打字你擔心,編譯器升級根本不擔心你,那么這主要解決了你的問題。
在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); };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.