为什么括号被消歧为带有 std::istream_iterator 的函数声明?

Why were parentheses disambiguated as a function declaration with std::istream_iterator?

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>());

是 return 类型 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;
}