我想创建一个引用变量的提升融合向量。目标是将不同数量的参数传递给函数并将它们添加到融合向量中。由于引用类型,我使用 TMP 一次添加每个元素。但有时融合向量中的某些元素是错误的。这似乎是未定义的行为(错误的值,读取访问冲突)。
我写了一个示例,在其中我“展开”了 TMP 中使用的递归以便于理解。它只是简单地添加两个对融合向量的引用并输出结果:
#include <iostream>
#include <boost/ref.hpp>
#include <boost/fusion/algorithm.hpp>
#include <boost/fusion/container.hpp>
using namespace boost;
using namespace boost::fusion;
//add second element
template <typename T>
vector<int&, double&> createVector2(T vec, double& v2) {
auto newVector = join(vec, make_vector(ref(v2)));
return newVector;
}
//add first element
template <typename T>
vector<int&, double&> createVector(T vec, int& v1, double& v2) {
auto newVector = join(vec, make_vector(ref(v1)));
return createVector2(newVector, v2);
}
int main() {
int v1 = 10;
double v2 = 15.3;
vector<> vec;
auto ret = createVector(vec, v1, v2);
std::cout << at_c<0>(ret) << std::endl;
std::cout << at_c<1>(ret) << std::endl;
if (at_c<0>(ret) != v1) {
std::cout << "FAILED" << std::endl;
}
if (at_c<1>(ret) != v2) {
std::cout << "FAILED" << std::endl;
}
return 0;
}
当访问 boost fusion 向量中的引用(读取访问冲突)时,程序崩溃,首先在此行:
std::cout << at_c<0>(ret) << std::endl;
我使用 VC11 作为编译器(版本 17.00.51106.1)。该错误仅在发布模式下。但是当我使用 VC10、GCC 4.7.0 或 GCC 4.7.2 时,没有错误,程序运行良好。
要让程序与 VC11 一起工作,我必须更改这一行
auto newVector = join(vec, make_vector(ref(v1)));
到
auto newVector = as_vector(join(vec, make_vector(ref(v1))));
那么,上面的示例是否包含错误或 VC11 优化器有问题?是否允许将本地 boost 融合视图(boost::fusion::join 仅返回一个视图,并且该视图通过 boost::fusion::vector 转换为“正常” boost::fusion::vector)到另一个按价值运作?