Неконстантный неявный «конвертирующий» конструктор - PullRequest
0 голосов
/ 08 марта 2020

Привет, ребята. Я работаю над системой обмена сообщениями, где есть 3 типа: потоки (память), касания (тип представления const), приемник (тип изменяемого представления). Теперь создать ответвление из потока очень просто, поскольку он может неявно преобразовывать поток в ответвление с помощью стандартного конструктора преобразования const ref. Но для раковин я не могу понять, как заставить его неявно конвертировать. Неявное преобразование - это то, что избавляет меня от многих головных болей (я не пытаюсь вникнуть в полное неявное преобразование - это злое обсуждение здесь), работая здесь с кодом кортежа и constexpr, можно ли было бы неявно создать приемник из потока, поддержание константности?

#include <tuple>

template<typename T>
struct Stream
{
};

template<typename T>
struct Tap
{
    Tap(const Stream<T>& stream)
    {}
};

template<typename T>
struct Sink
{
    Sink(Stream<T>&)
    {}
};



int main()
{
    Stream<float> stream;
    Tap<float> tap = stream;
    //Sink<float> sink = stream;

    std::tuple<Stream<float>, Stream<int>> streams;
    std::tuple<Tap<float>, Tap<int>> taps = streams;
    //std::tuple<Sink<float>, Sink<int>> sinks = streams;
}

1 Ответ

0 голосов
/ 08 марта 2020

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

constexpr tuple(const tuple<_U1, _U2>& __in)

Однако это терпит неудачу, потому что добавляет к потокам квалификацию const, что означает, что их нельзя использовать с конструктором класса Sink. Для того, чтобы это работало, тогда std :: tuple понадобится конвертирующий конструктор, который не добавляет квалификацию const, т.е. : https://godbolt.org/z/woF__K

Вам нужно скопировать здесь, будет ли достаточно перемещения?

...