我注意到了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)
唯一的区别是向量构造函数中的第一个参数.
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]
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |