3

给定这样的代码段:

#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++ 中,代码输出错误。

我对括号感到很奇怪。有什么区别,为什么?

4

2 回答 2

5

如果没有“额外”括号,您将获得 C++ 的“最令人头疼的解析”——而不是定义一个以str两个 istream_iterators 命名的对象来指定其初始化程序,而是将其解析为一个名为str返回 a的函数的声明string,以及“stuff”括号中指定了它采用的参数类型。

于 2012-04-06T05:56:56.590 回答
1

它看起来像是“C++ 最令人头疼的解析”问题的示例之一。看起来编译器将语句解释为接受两个参数()的函数的函数声明。str通过添加(),您将通知编译器它是一个对象,而不是函数原型签名的一部分。

于 2012-04-06T05:56:49.287 回答