Bitte den folgenden Code sehen (siehe es here leben):Verwirrung über die Rückkehr Art von std :: get() auf std :: Tupelobjekten
#include <iostream>
#include <tuple>
#include <type_traits>
#include <utility>
struct S {
int&& v;
};
int main() {
std::tuple<int&&> t(1);
std::cout << std::is_same<int, decltype(std::get<0>(t))>{} << std::endl;
std::cout << std::is_same<int&, decltype(std::get<0>(t))>{} << std::endl;
std::cout << std::is_same<int&&, decltype(std::get<0>(t))>{} << std::endl;
S s{1};
std::cout << std::is_same<int&&, decltype(s.v)>{} << std::endl;
}
Ich erwarte die Ausgabe 0 0 1 1
, um zu sehen, aber sowohl GCC als auch clang geben den Ausgang 0 1 0 1
statt. Wirklich verwirrt. Könnte mir jemand eine Erklärung geben?
Irgendwelche Ideen, warum 'std :: tuple_element <0, std :: tuple> :: type &' gibt ein 'int &' zurück Wie geht 'int &' + '&' in int & zusammen? –
James
@Phantom: Sehen Sie sich [Prägnante Erklärung der Referenz-Kollaps-Regeln] an (http://stackoverflow.com/questions/13725747/concise-explanation-of-reference-collapsing-rules-requested-1-aa- 2) – Jarod42
Vielen Dank. Genau das habe ich gesucht. – James