簡體   English   中英

trailing-return-type中占位符類型的用途是什么?

[英]What is the purpose of a placeholder type in a trailing-return-type?

根據[dcl.fct] / 2 ,下面的代碼段是合法的。 GCC和clang編譯並執行代碼

#include <iostream>
int i = -1;
auto f()->auto&& { return i; }
int main(){
    f() = 2;
    std::cout << i << '\n';
}

印花

2

但是在C ++中允許這個的目的是什么?

在上面的例子中,只需用int&替換trailing-return-type就可以得到相同的結果。 換句話說,我正在尋找一個示例,其中包含占位符類型的trailing-return-type將是有意義的。

您可以對一致性進行論證:您可以將其他類型作為尾隨返回類型,為什么不是占位符?

auto f() -> int&  { return i; }
auto f() -> auto& { return i; }

你可以對實用程序進行一個論證:lambdas的返回類型看起來像一個尾隨的返回類型,並且沒有其他地方可以放置占位符類型,所以你必須允許它為lambdas,所以不妨允許它用於函數?

auto f = []() -> int&  { return i; };
auto f = []() -> auto& { return i; };

您可以對代碼格式進行爭論。 尾隨返回類型允許一致的方式來聲明始終適用於所有情況的函數,因此只需將其排列:

auto g(auto x)     -> decltype(f(x)) { ... } // using trailing for parameter
auto Cls::member() -> type { ... }  // using trailing for scope (to find Cls::type)
auto h(auto x)     -> auto& { ... }  // using trailing for formatting

可能還有其他爭論。 但簡而言之,它很容易被允許並且顯然具有優點。

您可以在修改答案N3582 (2013年3月15日)1對原提案auto

auto in trailing-return-type

這個提議最初不允許在尾隨返回類型中使用auto,但從那以后有人指出將它放在那里是唯一的方法來指定lambda通過推導的引用類型返回:

 []()->auto& { return f(); } 

(請記住,不僅函數而且lambdas都可以具有尾隨返回類型

因此[dcl.spec.auto] / 2

在這樣的聲明符有效的任何上下文中, auto 類型說明符可以帶有帶尾隨返回類型 ([dcl.fct])的函數聲明


1注意:N3582在實際采用之前已被N3638取代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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