Как передать данные в справочную оболочку
Рассмотрим следующий фрагмент кода:
//option no 1
struct foo{
foo(baz &b) : _b(b){}
std::reference_wrapper<baz> _b;
};
//option no 2
struct bar{
bar(std::reference_wrapper<baz> b) : _b(b){}
std::reference_wrapper<baz> _b;
};
Мне интересно, есть ли практические различия между инициализацией foo
а также bar
, Если да, каковы плюсы и минусы каждого решения и какие из них следует предпочесть?
1 ответ
Решение
Есть как минимум разница с типами с оператором преобразования:
struct tobaz
{
operator baz&() const { static baz b; return b; }
};
затем
foo{tobaz()}; // Compile
bar{tobaz()}; // Won't compile
Поскольку только одно пользовательское преобразование может иметь место.
Ошибка произойдет с другой стороны для структуры с operator std::reference_wrapper<baz>()
,