解析缓冲区以创建元组时出错

时间:2015-01-23 08:47:20

标签: c++11 buffer tuples

我试图通过从缓冲区读取来构建元组。这是我的代码:

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);

现在假设缓冲区中添加的数据顺序为float,int,char ... read_from_stream以相反的顺序调用,即首先是char,然后是int,然后是float。我必须以相反的顺序(解析)指定函数模板参数类型才能正确读取数据。我希望保留订单。 我做错了什么?

我正在使用vs2013(更新4)

1 个答案:

答案 0 :(得分:4)

实际上,这看起来像是编译器中的错误。标准要求在列表初始化期间,初始化列表的元素严格按其出现的顺序进行评估。引用C ++ 11 8.5.4 / 4:

  

braced-init-list的 initializer-list 中, initializer-clauses, 包括包   扩展(14.5.3),按它们出现的顺序进行评估。也就是说,每个值计算和   在每个值计算和侧面之前,对与给定初始化子句相关联的副作用进行排序   在初始化列表的逗号分隔列表中跟随它的任何 initializer-clause 相关联的效果。   [注意:无论初始化的语义如何,此评估顺序都会保留;例如,它适用   当 initializer-list 的元素被解释为构造函数调用的参数时,即使如此   通常,对呼叫的参数没有排序限制。 -end note ]

(强调我的)

确实,使用GCC,您的代码works just fine