Pytanie Jak referencje do sklepu boost :: variant?


Poniższy kod kompiluje i robi "właściwą rzecz":

#include <boost/variant.hpp>
#include <iostream>

int main()
{
  int a = 10;
  boost::variant<int&, float&> x = a;
  a = 20;
  std::cout << boost::get<int&>(x) << "\n";
  return 0;
}

W jaki sposób plik boost :: variant zapisuje referencję? Zgodnie ze standardem C ++ sposób przechowywania referencji zależy wyłącznie od kompilatora. Właściwie, w jaki sposób boost::variant nawet wiedzieć, ile bajtów zajmuje referencja? sizeof(T&) == sizeof(T), więc nie może tego użyć sizeof() operator. Teraz wiem, że referencje są prawdopodobnie implementowane jako wskaźniki, ale nie ma gwarancji w tym języku. Dobre wyjaśnienie, w jaki sposób get<> a odwiedzanie działa, gdy wariant przechowuje referencje, dostaje dodatkowe punkty :)


12
2018-02-16 01:33


pochodzenie


Zawijając je w obiekt. << sizeof(std::vector<char>&), sizeof(std::vector<char>), sizeof(T); struct T { std::vector<char>& r; }; 56, 56, 8 - Lightness Races in Orbit


Odpowiedzi:


Możesz zadeklarować pola struct jako referencje.

struct ref_to_int {
    ref_to_int(int& init)
      : _storage(init) {} // _storage stores the reference.
private:
    int& _storage;
};

Możesz wziąć sizeof(ref_to_int), który jest 8 na moim x64 z gcc. Pole zawiera odniesienie.


6
2018-01-16 12:42