给出这样的代码段:
#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
using namespace std;
int main(){
ifstream file("1.txt");
string str((istream_iterator<char>(file)),istream_iterator<char>());
file.close();
cout<<str<<endl;
}
代码使用istream_iterator从文件构造一个字符串。
请注意,字符串构造函数的第一个参数附有一对括号。如果省略括号,则会出错。在VC ++ 2008中,会出现链接错误。在G ++中,代码输出错误。
我对括号感到很奇怪。有什么区别和原因?
答案 0 :(得分:5)
如果没有“额外”括号,你会得到C ++的“最令人烦恼的解析” - 而不是用两个istream_iterator来定义一个名为str
的对象来指定它的初始值,它被解析为一个名为{的函数的声明{1}}返回str
,括号中的“stuff”指定所需参数的类型。
答案 1 :(得分:1)
它看起来像是“C ++最令人烦恼的解析”问题的一个例子。看起来编译器正在使用()
将语句解释为函数str
的函数声明,它接受两个参数。通过添加()
,您通知编译器它是一个对象而不是函数原型签名的一部分。