簡體   English   中英

trailing-return-type中的占位符是否會覆蓋初始占位符?

[英]Does a placeholder in a trailing-return-type override an initial placeholder?

g ++似乎接受autodecltype(auto)任意組合作為初始和尾隨返回類型:

int a;
auto f() { return (a); }                             // int
auto g() -> auto { return (a); }                     // int
auto h() -> decltype(auto) { return (a); }           // int&
decltype(auto) i() { return (a); }                   // int&
decltype(auto) j() -> auto { return (a); }           // int
decltype(auto) k() -> decltype(auto) { return (a); } // int&

但是,clang拒絕jk ,說: 錯誤:具有尾隨返回類型的函數必須指定返回類型'auto',而不是'decltype(auto)'演示 )。

哪個編譯器正確? 在每種情況下應該使用哪個規則( autodecltype(auto) )? 尾隨返回類型中使用占位符類型是否有意義?

引入尾隨返回類型時需要auto

§8.3.5[dcl.fct] / 2

TD的聲明中, D表格

D1 ( parameter-declaration-clausecv-qualifier-seq opt ref-qualifier opt exception-specification opt attribute-specifier-seq opt trailing-return-type

並且聲明T D1包含的declarator-id 的類型是“derived -declarator-type-list T ”,

T應該是單一類型說明符 auto。 [...]

另見核心問題1852 ,與[dcl.spec.auto] / 1明顯矛盾。

@Xeo建設性意見后編輯:

看來這個問題是草案標准的兩個地方之間的矛盾。

根據標准草案§7.1.6.4自動說明符[dcl.spec.auto]:

1 autodecltype(auto) 類型說明符指定一個占位符類型 ,稍后將替換它,可以通過從初始化程序中扣除,也可以通過帶尾隨返回類型的顯式指定來替換。 auto類型說明符還用於表示lambda是通用lambda。

2在這樣的聲明有效的任何上下文中,占位符類型可以在decl-specifier-seq,type-specifier-seq,conversion-function-id或trailing-return-type中與函數聲明符一起出現。 如果函數聲明符包含trailing-return-type(8.3.5),則指定函數的聲明返回類型。 如果函數的聲明返回類型包含占位符類型,則函數的返回類型將從函數體中的return語句推導出來(如果有)。

對上述內容的唯一解釋是,Clang有一個錯誤。

但是,由於核心問題1852指定上述與§8.3.5/ 2函數[dcl.fct]相矛盾,因此應予以修改。 問題的狀態已經准備好,這表明這些變化已被接受。

因此,海灣合作委員會有一個應該報告的錯誤。

暫無
暫無

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

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