[英]It seems the current standard draft cannot interpret why two structured binding declaration conflict with each other
struct A{
int a;
};
struct B{
int b;
};
auto&& [x] = A{}; //#1
auto&& [x] = B{}; //#2
int main(){
}
在這個例子中,所有編譯器都會給出一個錯誤,即 #2 處的x
與 #1 處引入的 x 沖突。 但是,IIUC,后 C++20 工作草案標准中沒有任何規則可以解釋原因。
首先,在我看來,#2 的聲明和#1 的聲明聲明了同一個實體。 它們對應於: basic.scope#scope-3
如果兩個聲明(重新)引入相同的名稱、都聲明構造函數或都聲明析構函數,則兩個聲明對應,除非
[...]
他們根據basic.link#8聲明相同的實體
兩個實體聲明聲明同一個實體,如果考慮到未命名類型的聲明以引入它們的名稱以用於鏈接目的,如果有的話([dcl.typedef],[dcl.enum]),它們對應([basic.scope.scope]) ,具有相同的目標 scope 不是 function 或模板參數 scope ,或者
- 它們出現在同一個翻譯單元中,或者
- [...]
因此,就目前而言,它們聲明了相同的實體,並且不應將它們視為每個basic.scope#scope-4的潛在沖突
如果兩個聲明對應並導致它們的共享名稱表示不同的實體([basic.link]) ,則它們可能會發生沖突。 如果在任何 scope 中,一個名稱綁定到兩個可能沖突的聲明並且一個在另一個之前([basic.lookup]),則該程序是格式錯誤的。
如前所述,由於它們表示相同的實體,因此它們沒有潛在的沖突。
他們仍然沒有違反這條規則:
basic.link#11
對於實體 E 的任意兩個聲明:
- 如果一個將 E 聲明為變量或 function,則另一個應將 E 聲明為同一類型之一。
- [...]
由於此列表中未提及結構化綁定,因此它們不違反此規則。 類似,它們不違反單一定義規則
任何翻譯單元都不得包含一個以上任何變量的定義,function、class 類型、枚舉類型、模板、參數的默認參數(對於給定范圍內的 function)或模板參數。
至少,根據相關規則所說,這個例子中的兩個聲明不應該導致任何程序格式錯誤。 如果我沒有錯過其他一些規則,是否可以認為標准中的模糊性無法解釋為什么在這種情況下兩個結構化綁定聲明相互沖突? 這種情況在N4861中沒有詳細說明
這只是 [basic.link]/11 中的一個缺失案例:如果(兩個聲明中的一個)聲明了結構化綁定,則程序格式錯誤。 (一個也可以只要求另一個也聲明一個結構化綁定,然后在 [basic.def.odr]/1 中擴展列表,但這更復雜,並且表明可以在另一個翻譯單元中重新定義它。)
您引用的是該語言后 C++20 版本的工作草案中的文本。 因此,它描述的行為不太可能由當前存在的任何編譯器實現。 由於它是一個工作草案,它可能包含許多語言缺陷和/或錯誤,因此嘗試從中學習並不是一項富有成效的活動。
您引用的所有“對應”語言均來自 P1787,它不是任何 C++ 標准實際編譯器實現的一部分。 因此,編譯器為您提供了 C++20 功能,在這些規則下,這些顯然是沖突的。
P1787 中可能存在一些有缺陷的措辭,但對於復雜的提案和標准的工作草案,這是可以預料的。 提交一份缺陷報告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.