使用带有std :: pair的std :: vector emplace_back()和构造函数初始化列表

时间:2018-04-07 20:08:30

标签: c++ c++11 vector initialization

vector<pair<ofVec3f, ofVec3f>> Geometry;

// where ofVec3f is a class with a constructor w/ an initializer list
// inline ofVec3f::ofVec3f( float _x, float _y, float _z ):x(_x), y(_y), z(_z) {}

Geometry.emplace_back((1.0f, 2.0f, 3.0f), (4.0f, 5.0f, 6.0f));

我试图在我的向量中放入一些值,而不必创建一个临时的std ::对ofVec3f

此代码在Visual Studio 2017中编译。但是上面的代码在执行时会分配值Geometry [0] .first = {3.0,3.0,3.0}和second = {6.0,6.0,6.0}

我做错了什么?

2 个答案:

答案 0 :(得分:4)

尝试使用分段构造函数,这很好地保留了移动语义的规则(更多关于它here

#qj-tabs {
  display: flex !important;   /* Will not work unless defined as display: flex */
  flex-direction: row !important;
  flex-wrap: wrap !important;
}

#tabs-menu .wrapped .item {
  border-radius: 5px !important;
  border: 1px lightgray solid !important; /*  Just styling for the default theme here */
  margin: 0 2px 2px 0 !important;
}

#tabs-menu .wrapped .active.item {
    background-color: lightgray;
}

答案 1 :(得分:3)

如果没有使用std::piecewise_constructstd::forward_as_tuple作为@Ruan的答案指出,则无法执行此操作,这是因为(1.0f, 2.0f, 3.0f)(4.0f, 5.0f, 6.0f)被视为独立表达式。两个表达式都使用2个逗号运算符进行计算,它们基本上只返回右侧表达式。这会为您提供(3.0f)(6.0f),这就是您的价值来源。