【发布时间】:2020-09-01 20:02:39
【问题描述】:
以下代码尝试使用ns::generateInt() 作为Generator 的参数std::generate_n():
// main.cpp
#include <vector>
#include <algorithm>
#include <ctime>
static int _tmp = ( srand( time( NULL ) ), 0 );
namespace ns
{
int generateInt( int offset = 0 )
{
return offset + rand() % 128;
}
}
int main( int argc, char* argv[] )
{
std::vector<int> v;
int tmp = ns::generateInt(); // Fine to call ns::generateInt() w/ 0 args
std::generate_n( std::back_inserter( v ),
5,
ns::generateInt ); // Not accepted as 0-arg Generator
return 0;
}
此代码生成以下编译错误:
$ g++ --version && g++ ./main.cpp
g++ (GCC) 9.2.1 20190827 (Red Hat 9.2.1-1)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
In file included from /usr/include/c++/9/algorithm:62,
from ./main.cpp:4:
/usr/include/c++/9/bits/stl_algo.h: In instantiation of ‘_OIter std::generate_n(_OIter, _Size, _Generator) [with _OIter = std::back_insert_iterator<std::vector<int> >; _Size = int; _Generator = int (*)(int)]’:
./main.cpp:26:36: required from here
/usr/include/c++/9/bits/stl_algo.h:4493:18: error: too few arguments to function
4493 | *__first = __gen();
| ~~~~~^~
我知道std::generate_n() 签名接受一个接受0 个参数的Generator 函数/函子,但ns::generateInt() 的参数有一个默认值;如上所示,在非模板代码中,我可以不带参数调用ns::generateInt()。
如果对上述代码所做的唯一更改是这样...
int generateInt( /*int offset = 0*/ )
{
return /*offset +*/ rand() % 128;
}
...然后它编译就好了:
$ g++ ./main.cpp
$
从编译器的角度来看这里发生了什么?我的默认参数生成器函数是 invokable 有 0 个参数,所以 为什么它不能用作 @ 987654332@ 参数到std::generate_n()?
【问题讨论】:
标签: c++ stl generator default-arguments