2015-01-23 3 views
1

Я пытаюсь построить кортеж, читая из буфера. Вот мой код:Ошибка при разборе буфера для создания кортежа

template<class T> 
T read_from_stream(char *& stream) 
{ 
    T value; 
    memcpy(&value, stream, sizeof(T)); 
    stream += sizeof(T); 
    return value; 
} 


template <typename ... Args> 
tuple<Args...> parse(char * buffer) 
{ 
    return tuple<Args...>{read_from_stream<Args>(buffer)...}; 
} 

и я использую его как

auto tup = parse<float, int, char>(buf); 

Теперь предположим, что добавленные данные в буфер в последовательности поплавка, INT, символ ... read_from_stream вызывается в обратном порядке т.е. для char сначала, затем для int, а затем для float. Мне нужно указать типы параметров шаблона функции в обратном порядке (разбор), чтобы правильно прочитать данные. Я хочу, чтобы заказ был сохранен. Что я делаю неправильно?

Я использую vs2013 (обновление 4) по пути

ответ

4

Это выглядит как ошибка в вашем компиляторе, на самом деле. Стандарт предусматривает, что во время инициализации списка элементы списка инициализатора оцениваются строго в том порядке, в котором они отображаются. Цитирование C++ 11 8.5.4/4:

В инициализаторе-листе из рамно-инициализации-листа, в инициализаторе-положении,включая любой, которые являются результатом разложения пакета (14.5.3), оцениваются в том порядке, в котором они отображаются. То есть, каждое вычисление значения и побочных эффект, связанное с данным инициализатором-п секвенируют перед каждым вычислением значения и боковые эффекта, связанное с любым инициализатором-п, что следует за ней в разделенных запятых списка инициализатора -список. [Примечание: Этот заказ оценки выполняется независимо от семантики инициализации; например, применяется , когда элементы списка инициализаторов интерпретируются как аргументы вызова конструктора, хотя обычно не имеют ограничений последовательности для аргументов вызова. -end примечание]

(выделено мной)

И действительно, используя GCC, код works just fine.

Смежные вопросы