c++ - 为什么括号被消除歧义为 std::istream_iterator 的函数声明?

标签 c++ declaration function-declaration ambiguity

<分区>

auto queue = [](string str) {
    istringstream ss(str);
    //std::copy(std::istream_iterator<string>(ss),
    //          std::istream_iterator<string>(),
    //          std::ostream_iterator<string>(std::cout, " "));

    //deque<string> q(std::istream_iterator<string>(ss), std::istream_iterator<string>{});
    deque<string> q(std::istream_iterator<string>(ss), std::istream_iterator<string>());
    return q;
};

为什么编译器会报错

parentheses were disambiguated as a function declaration [-Wvexing-parse]

如果我用 istream_iterator<string>() 构造一个容器.

std::copy中的参数有什么区别吗?和容器构造函数?

最佳答案

这一行

 deque<string> q(std::istream_iterator<string>(ss),
                 std::istream_iterator<string>());

是一个函数声明,返回类型为 deque<string>和两个 std::istream_iterator<string> 类型的参数.第一个参数的名称为 ss,第二个参数未命名。

要使这一行成为变量 q 的声明,您应该这样写

 deque<string> q( ( std::istream_iterator<string>(ss) ),
                  (  std::istream_iterator<string>() ) );

 deque<string> q(std::istream_iterator<string>{ ss },
                 std::istream_iterator<string>{});

在这种情况下,使用表达式而不是参数声明。

您可以在括号中包含声明符。例如

int ( x );

当声明是参数声明时,您可以省略声明符,例如

int()

这是同一函数的三个声明的示例。

int f( int( x ) );
int f( int x );
int f( int( x ) )
{
    return 2 * x;
}

关于c++ - 为什么括号被消除歧义为 std::istream_iterator 的函数声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71646883/

相关文章:

c++ - 碳到 cocoa 转换库?

c++ - WIN32 :C++, 为什么在WM_CLOSE上调用Messagebox函数 程序死机

c++ - 自动变量创建的顺序是否对应​​声明的顺序?

c++ - 如何修复二进制运算符

python - 如何确定函数是否已由 `lambda` 或 `def` 声明?

c - 如何返回二维数组?

c++ - 在关闭程序之前等待 x 秒 C++

c++ - 对象声明/初始化为不同类上的私有(private)成员的问题

c++ - virtual 关键字在函数声明中的位置

c++ - Boost序列化抛出std异常