C++ 函数调用周围的括号
在下面的代码段中,如果排除对C++ 函数调用周围的括号,c++,C++,在下面的代码段中,如果排除对std::istreambuf_迭代器的第二次调用的括号,则最后一行出现编译错误: .c_str()的左边必须有一个类/struct/union std::ifstream文件(“file.txt”);; 字符串程序( std::istreambuf_迭代器(文件), (std::istreambuf_迭代器()); prog.c_str(); 这些括号实际上是做什么的?在我看来,他们应该能够被排除在外。如果没有括号,这将是一个失败的例子。它不会声明变量,而是返回一
std::istreambuf_迭代器的第二次调用的括号,则最后一行出现编译错误:
.c_str()的左边必须有一个类/struct/union
std::ifstream文件(“file.txt”);;
字符串程序(
std::istreambuf_迭代器(文件),
(std::istreambuf_迭代器());
prog.c_str();
这些括号实际上是做什么的?在我看来,他们应该能够被排除在外。如果没有括号,这将是一个失败的例子。它不会声明变量,而是返回一个名为prog
的std::string
函数,并将这两种类型作为参数。如果您尝试在之后调用它,您将得到一个链接器错误。您的直觉是好的:不需要它们。但事实确实如此。正如LuchianGrigore所说,它是为了避免“最令人烦恼的解析”,这是C++语法中的一个小故障。如果删除括号,那么<代码> STD::istRAMBufyItActualAuthor()/Cuth>表示函数调用,还是内联对象实例化?这就是编译器看到的模糊性,也就是错误。可能是完全相同的问题的重复,只是用向量而不是字符串。@DavidRodríguez dribeas问题是,我不知道为什么。我从错误消息中找到了原因:)如果你(或其他任何人)可以解释,我将删除此答案。+1:我甚至不知道它有一个名字!只发生一次:PIt可以被解析为一个函数,使用名为file
(即file
的int(a)=5;
类型的第一个参数和第二个函数指针(衰减后)类型的参数不带任何参数并返回std::istreambuf_迭代器
,此参数未命名。也就是说,它相当于一个声明:typedef std::istreambuf_迭代器it;std::string prog(it文件,it(*)())代码>@DavidRodríguez dribeas啊,没错。(文件)
把我弄糊涂了。:)
std::ifstream file("file.txt");;
std::string prog(
std::istreambuf_iterator<char>(file),
(std::istreambuf_iterator<char>()));
prog.c_str();