我试图通过从缓冲区读取来构建元组。这是我的代码:
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)
答案 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。