为什么使用 std::istream_iterator 消除括号作为函数声明的歧义?

isu*_*dfv 3 c++ declaration ambiguity function-declaration

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;
};

Run Code Online (Sandbox Code Playgroud)

为什么编译器会抱怨

括号作为函数声明已消除歧义 [-Wveshing-parse]

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

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

Vla*_*cow 5

这条线

 deque<string> q(std::istream_iterator<string>(ss),
                 std::istream_iterator<string>());
Run Code Online (Sandbox Code Playgroud)

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

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

 deque<string> q( ( std::istream_iterator<string>(ss) ),
                  (  std::istream_iterator<string>() ) );
Run Code Online (Sandbox Code Playgroud)

或者

 deque<string> q(std::istream_iterator<string>{ ss },
                 std::istream_iterator<string>{});
Run Code Online (Sandbox Code Playgroud)

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

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

int ( x );
Run Code Online (Sandbox Code Playgroud)

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

int()
Run Code Online (Sandbox Code Playgroud)

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

int f( int( x ) );
int f( int x );
int f( int( x ) )
{
    return 2 * x;
}
Run Code Online (Sandbox Code Playgroud)