2017-06-22 138 views
19

昨天我在SO上看到了關於結構化綁定的an interesting question
我們可以總結一下。考慮下面的例子的代碼:結構化綁定:當某些東西看起來像一個引用並且行爲與引用類似時,但它不是引用

#include <tuple> 
#include <type_traits> 

int main() { 
    auto tup = std::make_tuple(1, 2); 
    auto & [ a, b ] = tup; 
    // the following line won't compile for a isn't a reference 
    // static_assert(std::is_reference_v<decltype(a)>); 
} 

在這種情況下decltype(a)int(可能)因爲this bullet(工作草案):

如果e是一個括號的ID-表達命名結構結合[。 ..],decltype(e)是參考類型,如結構化綁定聲明的說明中給出的

Here是@Curious在感興趣的人的評論中提供的wandbox上的一個片段。它表明實際上a不是一個參考,僅此而已。
對於原來的問題到目前爲止這麼好,OP問爲什麼它是int而不是int &該標準說看起來像一個可以接受的答案。

無論如何,我想知道爲什麼委員會決定如此。在一天結束時,a引用元組中的元素,我可以通過a修改該元素。換句話說,a的聲明看起來就像是一個參考文獻,它的行爲與參考類似,但不是參考文獻。

我可以忍受這一點,但我想知道背後的原因是什麼。爲什麼decltype(a)不能簡單地int &?是否有一個褻瀆能理解的有意義的理由?

+0

你可以擴展你的例子來實際證明了''是不是一個參考?對'static_assert'應該很容易,比如'std :: is_reference :: value'。 –

+0

@TobySpeight在原始問題中有您要求的示例。這就是說,你可以簡單地打印'std :: is_reference_v ',它將返回0,以及'std:.is_same_v ',而'std:.is_same_v '將返回1.這很簡單。 – skypjack

+1

@TobySpeight使用在線編譯器https://wandbox.org/permlink/BKLeZRzPubEsPC5l? – Curious

回答

9

I wrote this yesterday

decltype(x),其中x是結構化的結合,名稱引用 類型的那結構結合。在類似於元組的情況下,這是由std::tuple_element返回的 類型,即使結構化綁定本身實際上始終是 引用(在這種情況下),也可能不是引用 。這有效地模擬了 綁定到其非靜態數據成員具有由tuple_element返回的類型 的結構的行爲,其中綁定 本身僅僅是實現細節的參考。

+0

Damnit,我昨天讀過那個頁面,可能在編輯之前。 – skypjack

+3

因此,簡單地說,就像'some_struct.member'? –

+0

因此,'auto [a,b] = exp'和'auto&[a,b] = exp'具有非常不同的行爲(對於exp的很多情況),但是在這兩種情況下'decltype(a)'是相同的? – Yakk

-1

此主題之前已經介紹過(查看結構化綁定標籤),並且您正在討論的行爲甚至在第二個答案中得到解決。但是,其基本原理是在p0144r2 3.5節闡述了:

如果語法擴展到允許const/& -qualifying個人 名類型?

例如:

auto [&x, const y, const& z] = f(); // NOT proposed 

我們認爲答案應該是否定的。這是一個簡單的功能,用於存儲 值並將名稱綁定到其組件,而不是聲明多個 變量。允許這樣的限定將是特徵蠕變, 將該特徵擴展爲不同的東西,即通過 聲明多個變量。

如果我們想聲明多重變量,我們已經有辦法 拼寫:

auto val = f(); 
T& x  = get<0>(val); 
T2 const y = get<1>(val); 
T3 const& z = get<2>(val); 
+2

我不認爲這是相關的:問題是爲什麼整個結構化綁定的引用限定符不適用於這兩個已聲明的元素 - 並不是爲什麼這些元素不能單獨驗證。 –

相關問題