许多编码人员可能会混淆这段代码:

int main() {
  std::ifstream ifs("filename", std::ios::binary);
  std::string content((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
  //                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
  ...
}

我想清楚地理解这段代码,所以问题是:

  1. 为什么std::istreambuf_iterator<char>(ifs)包含在( , )

  2. 如果删除此处的括号,如何确定此代码?

  3. 如果不去掉括号,如何确定代码?

谢谢你的帮助。

#1楼 票数:0 已采纳

在声明中,声明符可以括在括号中。

考虑以下函数声明

void f( int ( x ), int ( y ) );

该声明声明了一个带有两个 int 类型参数的函数。

在声明中可以省略标识符的名称。

所以你可以写

void f( int (), int () );

该声明又声明了一个函数,该函数接受函数类型int()两个参数。

所以这个构造

std::string content(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());

编译器可以将其视为具有返回类型 std::string 和类型为std::istreambuf_iterator<char>的第一个参数和标识符ifs和具有函数类型istreambuf_iterator<char>()的第二个参数的函数的istreambuf_iterator<char>()

为了区分声明和表达式,可以使用括号,例如

std::string content( ( std::istreambuf_iterator<char>(ifs) ), std::istreambuf_iterator<char>());

或大括号

std::string content(std::istreambuf_iterator<char>{ ifs }, std::istreambuf_iterator<char>());

这是一个演示程序,展示了如何在参数声明中查看声明符。

#include <iostream>

void f( int ( x ), int ( y ) )
{
    std::cout << "x = " << x << ", y = " << y << '\n';
}

void f( int(), int() );

void f( int g(), int h() )
{
    std::cout << g() + h() << '\n';
}    

int g() { return 100; }

int main()
{
    f( 10, 20 );    

    f( g, g );
}

程序输出是

x = 10, y = 20
200

至于出现在关于函数类型参数声明的评论中的问题,例如,C 函数qsort使用这样一个参数来说明数组的两个元素之间的关系。

void qsort(void *base, size_t nmemb, size_t size,
int compar(const void *, const void *));

另一个例子是使用函数类型作为类模板std::function的模板参数。

  ask by Gallen Calade translate from so

未解决问题?本站智能推荐:

3回复

将函数赋值给函数指针,const参数的正确性?

我现在正在大学学习C ++和OOP的基础知识。 我不是100%确定函数指针在为它们分配函数时如何工作。 我遇到了以下代码: void mystery7(int a, const double b) { cout << "mystery7" << endl; }cons
1回复

传递一个std::vector从istreambuf_iterator构造

我有以下代码: setData声明如下: 我有以下错误: reader.cpp:752:错误:没有匹配的函数可以调用 'Image :: setData(std :: vector(&)(std :: istreambuf_iterator>,std :: istrea
1回复

奇怪的C函数声明[重复]

这个问题在这里已经有了答案: C 函数语法,参数列表后声明的参数类型(7 个回答) 8 个月前关闭。 当我在其中一个源文件中遇到此问题时,我正在处理一些代
2回复

如果我用一个空参数表声明一个函数,然后传递参数怎么办?

例如, 输出: 这段代码编译得很好(没有使用clang的警告)并运行良好。 但我想知道传递给foo()的值会发生什么? 他们被推入堆栈还是被丢弃? 也许这个问题听起来毫无用处,但它确实有意义。 例如,当我有int main()而不是int main(void) ,并将一些命令行
1回复

如何使用std::istreambuf_iterator初始化字符串

所以我试图阅读一段代码 有人可以向我解释这一行到底发生了什么: 我知道它应该返回一个由两个迭代器之间的范围组成的字符串,但我不完全明白这里选择的是什么范围。 如果有人能首先向我解释 istreambuf 是如何工作的,那也太棒了! 答案越简单越好,因为我是 C++ 新手
2回复

如何正确初始化函数指针

关闭。 这个问题需要调试细节。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack O
3回复

关于C中的函数指针[重复]

这个问题在这里已经有了答案: C中的函数指针是如何工作的? (11 个回答) 去年关闭。 下面的finding功能有什么神奇之处? 1)
2回复

函数参数:上限vs父类作为参数?

考虑一下我们有: 这两个函数声明之间有什么区别: 和 如果使用哪种类型的声明,那将是一些很好的例子...... [UPDATE] 在那里可以找到另一个很好的例子和解释。 这是你应该使用上限而不仅仅是派生类作为参数的另一个例子。