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));
我正在尝试在我的向量中输入一些值,而不必创建 ofVec3f 的临时 std::p air
此代码在 Visual Studio 2017 中编译。 但是,上面的代码在执行时分配值 Geometry[0].first
= {3.0, 3.0, 3.0} 和第二个 = {6.0, 6.0, 6.0}我做错了什么?
尝试使用分段构造函数,这对于保持移动语义规则非常有用(更多关于它的信息在这里(
Geometry.emplace_back(std::piecewise_construct, std::forward_as_tuple(1.0f, 2.0f, 3.0f), std::forward_as_tuple(4.0f, 5.0f, 6.0f));
如果不使用std::piecewise_construct
和std::forward_as_tuple
,就无法做到这一点 正如@Ruan的回答所指出的那样,这是因为(1.0f, 2.0f, 3.0f)
和(4.0f, 5.0f, 6.0f)
被视为独立的表达。这两个表达式都使用 2 个逗号运算符进行评估,基本上只返回右侧表达式。这给了你(3.0f)
和(6.0f)
,这就是你的价值观的来源。