C ++ 17中的向量初始化

Dee*_*eep 3 c++ vector c++17

当我使用C ++ 17编译此代码时,它可以很好地工作,但是除C ++ 17之外的任何版本都将引发错误[与C ++ 14一起尝试]:

错误:“ v”
向量v {1、2、3} 之前缺少模板参数;

这是我正在使用的代码片段:

#include <vector>
#include <iostream>

using std::vector;
using std::cout;

int main() {

    // Vector initialization
    vector v {1, 2, 3};

    for (int i=0; i < v.size(); i++) {
      cout << v[i] << "\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

std::vectorC ++ 17中的声明和/或初始化是否已更改?谁能解释为什么C ++ 17编译此向量初始化(按预期)而没有任何错误?

Bar*_*ack 5

在C ++ 17之前,您必须通过模板指定向量的类型:

std::vector<int> v{1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

相反,C ++ 17允许“推演”,这就是即使没有指定向量中包含的类型也可以编译代码的原因。您可以在此处了解更多信息。

通常,我建议您指定可读性的类型,即使演绎可以达到您的期望。

  • 依靠演绎有两个阵营:赞成,反对。(例如,空格与制表符,大括号放在何处,或vim与emacs。)如果您在团队中,请使用团队喜欢的任何一种。 (3认同)
  • @MichaWiedenmann您能解释一下为什么您不同意吗? (2认同)
  • 1. Eljay是100%正确的,这个话题是主观的而不是客观的,即没有最好的方法,只有后果。2.我喜欢类型推导的事情:消除冗余;在带有大量模板参数的代码中,感觉就像是在阻碍我;我喜欢在Haskell中看到的内容。我不喜欢的事情:在我想知道类型的情况下,获取此信息变得更加困难,并且可能依赖于IDE /工具支持。但本质上是Eljay。 (2认同)