我刚读在C++标准std::for_each是一个非修改序列操作,具有沿find,search等等.这是否意味着应用于每个元素的函数不应该修改它们?这是为什么?什么可能出错?
这是一个示例代码,其中修改了序列.你能看到它有什么问题吗?
void foo(int & i)
{
i = 12;
}
int main()
{
std::vector<int> v;
v.push_back(0);
std::for_each(v.begin(), v.end(), foo);
// v now contains 12
}
Run Code Online (Sandbox Code Playgroud)
我怀疑这只是一个解释问题,但我想对此有所了解.
PS:我知道我可以用std::transform而不是for_each,但那不是重点.
我试图创建一个指向具有默认参数的成员函数的指针.当我通过这个函数指针调用时,我不想为默认参数指定一个参数.根据标准,这是不允许的,但我从来没有发现任何标准不允许的东西,我不能以其他一致的方式做.到目前为止,我还没有找到办法做到这一点.
这是代码,说明我正在尝试解决的问题:
class MyObj
{
public:
int foo(const char* val) { return 1; }
int bar(int val = 42) { return 2; }
};
int main()
{
MyObj o;
typedef int(MyObj::*fooptr)(const char*);
fooptr fp = &MyObj::foo;
int r1 = (o.*fp)("Hello, foo.");
typedef int(MyObj::*barptr)(int);
barptr bp1 = &MyObj::bar;
int r2 = (o.*bp1)(); // <-- ERROR: too few arguments for call
typedef int (MyObj::*barptr2)();
barptr2 bp2 = &MyObj::bar; // <-- ERROR: Can't convert from int(MyObj::*)(int) to int(MyObj::*)(void)
int r3 = (o.*bp2)();
return …Run Code Online (Sandbox Code Playgroud)