将 std::vector emplace_back() 与 std::p air 一起使用,并带有构造函数初始值设定项


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_constructstd::forward_as_tuple,就无法做到这一点 正如@Ruan的回答所指出的那样,这是因为(1.0f, 2.0f, 3.0f)(4.0f, 5.0f, 6.0f)被视为独立的表达。这两个表达式都使用 2 个逗号运算符进行评估,基本上只返回右侧表达式。这给了你(3.0f)(6.0f),这就是你的价值观的来源。

相关内容

最新更新