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?
这条线
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)