2016-11-18 55 views
24

前奏:std ::忽略與結構化的綁定?

std::tuple<int, int, int> f(); 
std::tuple<int, int, float, int> g(); 

C++ 1Z將介紹語法結構綁定,這將有可能寫的,而不是

int a, b, c; 
std::tie(a, b, c) = f(); 

auto [a, b, c] = f(); 

然而,std::tie也允許指定std::ignore忽略某些組件,例如:

std::tie(a, b, std::ignore, c) = g(); 

是否有可能使用新的結構化綁定語法來做類似的事情?它將如何工作?

+1

只是在那裏放了一個任意的名字。 –

+0

@ n.m。會不會有一個任意的名字創建一個副本? –

+1

@Piotr我認爲沒有比'std :: ignore'更多的副本。由於我們保證了copy elision,所以虛擬變量被初始化;使用'std :: tie',初始化位於std :: ignore分配的rhs中的臨時對象。 – j6t

回答

15

結構化綁定的建議包含一個專用的部分回答你的問題(P0144R2):

3.8如果有一種方法來明確忽略組件?

的動機是沉默關於未使用名稱的編譯器警告。 我們認爲答案應該是「還沒有」。這不是出於用例的驅動(沉默編譯器警告是一種動機,但它本身不是一個用例),最好留待我們在上下文中重新審視之前更普遍的模式匹配建議,這應該是一個特例。

對稱std::tie建議使用像一個std::ignore

tuple<T1,T2,T3> f(); 

auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element 

然而,這種感覺很尷尬。

在語言中預測模式匹配可能會提示像_*這樣的通配符,但由於我們還沒有模式匹配,因此選擇我們知道將兼容的語法爲時過早。這是一個純粹的擴展,可以等待模式匹配。

但是,注意,標準的工作草案目前正由相關國家成員體(NB)修訂,並有一個NB評論請求此功能(P0488R0,US100):

分解聲明應該提供語法來丟棄一些返回值,就像std::tie使用std::ignore一樣。

+1

現在已經太晚了,但我會指出,使用感覺尷尬的功能並且將來可能會被替換好於*根本不具備使用該功能的能力*,這看起來並不像標準委員會希望用於時間機器那樣的事情,因爲沒有對結構化綁定中的'std :: ignore'的其他合理解釋。 –

2

是否可以使用新的結構化綁定語法來做類似的事情?

不需要。您只需構建一個變量名稱,稍後將不再提及。

+4

將會產生未使用的變量警告'-Wunused-variable',你可以使用:'[[maybe_unused]] auto [a,b,dummy] = std :: tuple(1,「2」,3f);'意味着他們中的任何一個都可能未被使用,你不知道哪一個。目前沒有好的解決方案。希望它會在C++ 20中得到改進。從這裏採取:https://stackoverflow.com/questions/41404001/structured-binding-with-maybe-unused?noredirect=1&lq=1 – serine