[英]auto, decltype(auto) and trailing return type
是否有區別:
template <class T>
constexpr decltype(auto) f(T&& x) -> decltype(std::get<0>(std::forward<T>(x)))
{
return std::get<0>(std::forward<T>(x));
}
和:
template <class T>
constexpr auto f(T&& x) -> decltype(std::get<0>(std::forward<T>(x)))
{
return std::get<0>(std::forward<T>(x));
}
如果是這樣,它是什么,我應該使用哪一個來完美轉發?
auto
一起使用 decltype(auto)
vs auto
的要點是區分返回類型是引用還是值的情況 。 但在您的情況下,返回類型已經明確定義為decltype(std::get<0>(std::forward<T>(x)))
,因此即使您使用auto
,它也將被完美轉發。
在auto f() -> T
,“auto”關鍵字只是一個用於填充類型位置的語法結構 。 它沒有其他目的。
實際上,在C ++ 17中,你不能同時使用帶尾隨返回類型的decltype(auto)
。
C ++ 14措辭(n3936§7.1.6.4[dcl.spec.auto] / 1):
auto
和decltype(auto)
類型說明符指定一個占位符類型,該類型將在以后被替換,可以通過從初始化程序中進行推導,也可以通過使用trailing-return-type的顯式指定進行替換。auto
類型說明符還用於表示lambda是通用lambda。
C ++ 17措辭(n4618§7.1.7.4[dcl.spec.auto] / 1):
auto
和decltype(auto)
類型說明符用於指定占位符類型,稍后將通過從初始值設定項中進行推導來替換該占位符類型。auto
類型說明符還用於引入具有尾隨返回類型的函數類型或表示lambda是通用lambda(5.1.5)。auto
類型說明符也用於引入分解聲明(8.5)。
這是DR 1852 ,請參閱trailing-return-type中的占位符是否覆蓋初始占位符? 。
實際上,雖然gcc
接受decltype(auto) f() -> T
( 這是一個bug ),但是clang
會拒絕它說
error: function with trailing return type must specify return type 'auto',
not 'decltype(auto)'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.