昨天我在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 &
?是否有一個褻瀆能理解的有意義的理由?
你可以擴展你的例子來實際證明了''是不是一個參考?對'static_assert'應該很容易,比如'std :: is_reference :: value'。 –
@TobySpeight在原始問題中有您要求的示例。這就是說,你可以簡單地打印'std :: is_reference_v',它將返回0,以及'std:.is_same_v ',而'std:.is_same_v '將返回1.這很簡單。 –
skypjack
@TobySpeight使用在線編譯器https://wandbox.org/permlink/BKLeZRzPubEsPC5l? – Curious