C++ 在std::vector上重新放置

C++ 在std::vector上重新放置,c++,variadic-templates,C++,Variadic Templates,我不明白为什么由于emplace\u back的“坏”用法,下面的代码无法编译。你能告诉我它有什么问题吗?我可以使用什么解决方法 #include <vector> class Test { private: std::size_t n_; std::vector<double> a_; std::vector<double> b_; public: Test(std::size_t n, std::initializer_list&l

我不明白为什么由于emplace\u back的“坏”用法,下面的代码无法编译。你能告诉我它有什么问题吗?我可以使用什么解决方法

#include <vector>

class Test {
 private:
  std::size_t n_;
  std::vector<double> a_;
  std::vector<double> b_;

 public:
  Test(std::size_t n, std::initializer_list<std::size_t> list)
      : n_(n), a_(list.begin()[0]), b_(list.begin()[1]){};
};

int main() {
  Test t{5, {3, 4}};

  std::vector<Test> v;
  v.emplace_back(5, {3, 4});

  return 0;
}
#包括
课堂测试{
私人:
标准:尺寸;
std::向量a;
std::向量b_;
公众:
测试(标准::大小,标准::初始值设定项列表)
:n(n),a(list.begin()[0]),b(list.begin()[1]){};
};
int main(){
测试t{5,{3,4};
std::向量v;
v、 后侵位(5,{3,4});
返回0;
}

{3,4}在这里没有类型,因此,您需要明确声明您正在使用初始值设定项列表,如下所示:

v.emplace_back(5, std::initializer_list<std::size_t>{3, 4});
v.emplace_back(5,std::initializer_list{3,4});

使用v.emplace_back(测试(5,{3,4}));将测试对象添加到vector [OT]中:如果初始化列表应该总是大小为2,考虑使用<代码> STD::数组< /代码>,或者由两个替换parameters@piotr:此代码显然是真实代码。我把它简化了,而且我同意这样做看起来很愚蠢。@user3668810-创建一个
测试
对象几乎违背了
部署回
的目的;你也可以打电话给
push_back
emplace\u back
的要点是它不需要对象,但将根据其参数就地构造一个对象,从而消除复制操作。@PeteBecker感谢您指出这一点。我已经读了一些关于这两种方法(push_back和emplace_back)的书,现在我真的不明白在stl中同时使用这两种方法有什么意义。
{3,4}
确实有一个类型。只是它是
std::initializer\u list
,而不是必需的
std::initializer\u list
。我很困惑,为什么它在这里没有类型,为什么我直接构造测试t时它有类型。@MartinBonner:不,它没有类型,因此无法推导,因此OP有一个error@PiotrSkotnicki:有趣。“cpp.sh”对
autotest={3,4}感到满意我的直觉是C++中的表达式通常都有一种类型,它只是基于表达式,而不是上下文。然而,更多的实验表明,
{3,4}
的行为不像
迭代器列表类型的表达式。相反,它是一个特定的构造,只允许在某些地方使用。@MartinBonner对于
auto
,有一个特殊的规则,通常不适用于模板