为什么括号被消歧为带有 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;
}
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;
}