RVO со стандартной структурой размещения без каких-либо конструкторов

У меня есть структура, представляющая двоичное сообщение. Я хочу написать функцию, чтобы получить следующую такую ​​запись из буфера (файл или сокет, не имеет значения):

template <typename Record>
Record getNext();

Теперь я мог бы написать это так:

template <typename Record>
Record getNext() {
    Record r;
    populateNext(reinterpret_cast<char*>(&r),  // maybe ::read()
                 sizeof(r));                   // or equivalent
    return r;
}

, что приятно и дает мне преимущества RVO. Тем не менее, он вызовет конструктор по умолчанию из Record, который может состоять из типов с нетривиальными конструкторами по умолчанию, которые действительно работают, чего я хотел бы избежать - это не обязательно POD-типы, но они и ] стандартный макет.

Есть ли способ написать getNext() таким образом, чтобы мы избегали каких-либо конструкторов (по умолчанию или копировать / перемещать) в Record? В идеале, когда пользователь вызывает:

auto record = getNext<Record>();

Буфер считывается непосредственно в память record. Это возможно?

10
задан Barry 9 June 2015 в 15:50
поделиться