Как передать данные в справочную оболочку - PullRequest
0 голосов
/ 09 января 2019

Рассмотрим следующий фрагмент кода:

//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 Ответ

0 голосов
/ 09 января 2019

Существует, по крайней мере, разница с типами с оператором преобразования:

struct tobaz
{
    operator baz&() const { static baz b; return b; }
};

Тогда

foo{tobaz()}; // Compile
bar{tobaz()}; // Won't compile

Поскольку может иметь место только одно преобразование пользователя.

Демо

Ошибка произойдет с другой стороны для структуры с operator std::reference_wrapper<baz>().

...