簡體   English   中英

auto,decltype(auto)和尾隨返回類型

[英]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):

autodecltype(auto) 類型說明符指定一個占位符類型,該類型將在以后被替換,可以通過從初始化程序中進行推導,也可以通過使用trailing-return-type的顯式指定進行替換。 auto 類型說明符還用於表示lambda是通用lambda。

C ++ 17措辭(n4618§7.1.7.4[dcl.spec.auto] / 1):

autodecltype(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM