c ++向量构造函数的奇怪行为

ric*_*ick 0 c++ stl vector

我注意到了c ++ vector构造函数的一些奇怪的行为,有人可以为我解释一下吗?谢谢.

代码段1有效:

#include <string>
#include <vector>
#include <iostream>
#include <istream>
#include <ostream>
#include <iterator>
#include <sstream>
#include <algorithm>

using namespace std;

int main()
{
  string str = "The quick brown fox";

  stringstream strstr(str);

  istream_iterator<string> start(strstr);
  vector<string> results(start, istream_iterator<string>());

  ostream_iterator<string> oit(cout, "\n");
  copy(results.begin(), results.end(), oit);
}
Run Code Online (Sandbox Code Playgroud)

但是代码段2没有:

#include <string>
#include <vector>
#include <iostream>
#include <istream>
#include <ostream>
#include <iterator>
#include <sstream>
#include <algorithm>

using namespace std;

int main()
{
  string str = "The quick brown fox";

  stringstream strstr(str);

  vector<string> results(istream_iterator<string>(strstr), istream_iterator<string>());

  ostream_iterator<string> oit(cout, "\n");
  copy(results.begin(), results.end(), oit);
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是向量构造函数中的第一个参数.

qua*_*dev 5

最烦恼的解析:

 vector<string> results(istream_iterator<string>(strstr), istream_iterator<string>());
Run Code Online (Sandbox Code Playgroud)

被解析为一个函数,称为results返回a vector并取一个名为strstrtype的istream_iterator<string>参数和一个未命名的参数,类型为"函数不带参数并返回istream_iterator<string>".

将其更改为:

vector<string> results = vector<string>(istream_iterator<string>(strstr), istream_iterator<string>());
Run Code Online (Sandbox Code Playgroud)

或者你可以添加括号,但它也不是很可读:

vector<string> results( ( istream_iterator<string>(strstr) ), istream_iterator<string>());
Run Code Online (Sandbox Code Playgroud)

正如BenjaminLindley在评论中所建议的那样,更易读/更容易出错的方法是在单独的语句中声明迭代器:

auto begin = istream_iterator<string>(strstr);
auto end = istream_iterator<string>();
vector<string> results(begin, end); 
Run Code Online (Sandbox Code Playgroud)

注意:

一些编译器,如clang,对此发出警告:

警告:括号被消除歧义为函数声明[-Wvexing-parse]

  • 花括号也不会在这里工作吗? (2认同)