C++11 分析缓冲区以创建元组时出错

C++11 分析缓冲区以创建元组时出错,c++11,buffer,tuples,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...> p

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

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)...};
}
模板
无法从_流(char*&流)读取_
{
T值;
memcpy(&value,stream,sizeof(T));
流+=sizeof(T);
返回值;
}
模板
元组分析(字符*缓冲区)
{
返回元组{read_from_stream(buffer)…};
}
我用起来就像

auto tup = parse<float, int, char>(buf);
auto-tup=parse(buf);
现在假设缓冲区中添加的数据是按顺序float、int、char。。。以相反的顺序调用read_from_流,即先调用char,然后调用int,然后调用float。我必须以相反的顺序(解析)指定函数模板参数类型以正确读取数据。我想保留订单。 我做错了什么


顺便说一下,我正在使用vs2013(更新4)

实际上,这看起来像是编译器中的一个bug。该标准规定,在列表初始化过程中,应严格按照元素出现的顺序对初始化器列表的元素进行评估。引用C++11 8.5.4/4:

在带括号的init列表的初始值设定项列表中,初始值设定项子句,包括由pack生成的任何 扩展项(14.5.3)按其出现的顺序进行评估。也就是说,每个值的计算和 与给定初始值设定项子句相关联的副作用在每次值计算和副作用之前排序 与初始值设定项列表的逗号分隔列表中紧跟其后的任何初始值设定项子句关联的效果。 [注意:无论初始化的语义如何,此求值顺序都适用;例如,它适用于 当初始值设定项列表的元素被解释为构造函数调用的参数时,即使 通常,调用的参数没有顺序约束。-结束说明]

(强调矿山)


事实上,使用GCC,您的代码。

实际上,这看起来像是编译器中的一个bug。该标准规定,在列表初始化过程中,应严格按照元素出现的顺序对初始化器列表的元素进行评估。引用C++11 8.5.4/4:

在带括号的init列表的初始值设定项列表中,初始值设定项子句,包括由pack生成的任何 扩展项(14.5.3)按其出现的顺序进行评估。也就是说,每个值的计算和 与给定初始值设定项子句相关联的副作用在每次值计算和副作用之前排序 与初始值设定项列表的逗号分隔列表中紧跟其后的任何初始值设定项子句关联的效果。 [注意:无论初始化的语义如何,此求值顺序都适用;例如,它适用于 当初始值设定项列表的元素被解释为构造函数调用的参数时,即使 通常,调用的参数没有顺序约束。-结束说明]

(强调矿山)

事实上,使用GCC,您的代码