c+的怪异行为+;向量构造器 我注意到C++向量构造函数的一些奇怪行为,有人能解释一下吗?谢谢

c+的怪异行为+;向量构造器 我注意到C++向量构造函数的一些奇怪行为,有人能解释一下吗?谢谢,c++,vector,stl,C++,Vector,Stl,代码片段1起作用: #include <string> #include <vector> #include <iostream> #include <istream> #include <ostream> #include <iterator> #include <sstream> #include <algorithm> using namespace std; int main() {

代码片段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);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
string str=“敏捷的棕色狐狸”;
stringstream strstr(str);
istream_迭代器启动(strstr);
向量结果(开始,istream_迭代器());
ostream_迭代器oit(cout,“\n”);
复制(results.begin()、results.end()、oit);
}
但代码段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);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
string str=“敏捷的棕色狐狸”;
stringstream strstr(str);
向量结果(istream_迭代器(strstr),istream_迭代器());
ostream_迭代器oit(cout,“\n”);
复制(results.begin()、results.end()、oit);
}
唯一的区别是向量构造函数中的第一个参数。

或者可以添加括号,但也不太可读:

vector<string> results( ( istream_iterator<string>(strstr) ), istream_iterator<string>());
向量结果((istream_迭代器(strstr)),istream_迭代器();
正如BenjaminLindley在评论中所建议的,一种可读性更高/更不容易出错的方法是在单独的语句中声明迭代器:

auto begin = istream_iterator<string>(strstr);
auto end = istream_iterator<string>();
vector<string> results(begin, end); 
auto begin=istream\u迭代器(strstr);
自动结束=istream_迭代器();
矢量结果(开始、结束);

注意:

某些编译器(如clang)对此发出警告:

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

:

或者可以添加括号,但也不太可读:

vector<string> results( ( istream_iterator<string>(strstr) ), istream_iterator<string>());
向量结果((istream_迭代器(strstr)),istream_迭代器();
正如BenjaminLindley在评论中所建议的,一种可读性更高/更不容易出错的方法是在单独的语句中声明迭代器:

auto begin = istream_iterator<string>(strstr);
auto end = istream_iterator<string>();
vector<string> results(begin, end); 
auto begin=istream\u迭代器(strstr);
自动结束=istream_迭代器();
矢量结果(开始、结束);

注意:

某些编译器(如clang)对此发出警告:

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


编译器将考虑此语句

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


编译器将考虑此语句

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


它怎么会“不起作用”?最令人烦恼的解析再次出现。下面的答案在诊断中是正确的,但我只想建议一种替代解决方案,在我看来,它更容易理解。在与向量分开的语句中声明迭代器<代码>istream_迭代器b(strstr),e;向量结果(b,e)@BenjaminLindley yep,在答案中添加。它如何“不起作用”?最令人烦恼的解析再次出现。下面的答案在诊断中是正确的,但我只想建议一种替代解决方案,在我看来,它更容易理解。在与向量分开的语句中声明迭代器<代码>istream_迭代器b(strstr),e;向量结果(b,e)@BenjaminLindley yep,在答案中添加。我还认为“最令人烦恼的解析”是答案。然而,我感到困惑的是,我甚至不能编译第二个示例。我一直认为“最烦人的解析”就像一个noop@菲利普克莱恩:不,声明不是错误。但是,使用
结果
作为向量是正确的。啊,你是对的。:-)大括号在这里不也可以吗?@remyabel在c++11中也可以,我也认为“最麻烦的解析”是答案。然而,我感到困惑的是,我甚至不能编译第二个示例。我一直认为“最烦人的解析”就像一个noop@菲利普克莱恩:不,声明不是错误。但是,使用
结果
作为向量是正确的。啊,你是对的。:-)卷发器也不工作吗?@ C++中的ReMyabel.11@T.C.谢谢你的编辑。@T.C.谢谢你的编辑。
vector<string> results( { istream_iterator<string>(strstr), istream_iterator<string>() } );
int f( int (x), int (y) );
int ( x ) = 10;