#include <iostream>
void foo(int a, int b, int c = -1) {
std::cout << "foo(" << a << ", " << b << ", " << c << ")\n";
}
int main() {
foo(1, 2); // output: foo(1, 2, -1)
// error: does not use default from surrounding scope
//void foo(int a, int b = 0, int c);
void foo(int a, int b, int c = 30);
foo(1, 2); // output: foo(1, 2, 30)
// error: we cannot redefine the argument in the same scope
// void foo(int a, int b, int c = 35);
// has a default argument for c from a previous declaration
void foo(int a, int b = 20, int c);
foo(1); // output: foo(1, 20, 30)
void foo(int a = 10, int b, int c);
foo(); // output: foo(10, 20, 30)
{
// in inner scopes we can completely redefine them
void foo(int a, int b = 4, int c = 8);
foo(2); // output: foo(2, 4, 8)
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdm9pZCBmb28oaW50IGEsIGludCBiLCBpbnQgYyA9IC0xKSB7CglzdGQ6OmNvdXQgPDwgImZvbygiIDw8IGEgPDwgIiwgIiA8PCBiIDw8ICIsICIgPDwgYyA8PCAiKVxuIjsKfQoKaW50IG1haW4oKSB7Cglmb28oMSwgMik7ICAgLy8gb3V0cHV0OiBmb28oMSwgMiwgLTEpCgoJLy8gZXJyb3I6IGRvZXMgbm90IHVzZSBkZWZhdWx0IGZyb20gc3Vycm91bmRpbmcgc2NvcGUKCS8vdm9pZCBmb28oaW50IGEsIGludCBiID0gMCwgaW50IGMpOwoJCgl2b2lkIGZvbyhpbnQgYSwgaW50IGIsIGludCBjID0gMzApOwoJZm9vKDEsIDIpOyAgIC8vIG91dHB1dDogZm9vKDEsIDIsIDMwKSAKCQoJLy8gZXJyb3I6IHdlIGNhbm5vdCByZWRlZmluZSB0aGUgYXJndW1lbnQgaW4gdGhlIHNhbWUgc2NvcGUKCS8vIHZvaWQgZm9vKGludCBhLCBpbnQgYiwgaW50IGMgPSAzNSk7CgkKCS8vIGhhcyBhIGRlZmF1bHQgYXJndW1lbnQgZm9yIGMgZnJvbSBhIHByZXZpb3VzIGRlY2xhcmF0aW9uCgl2b2lkIGZvbyhpbnQgYSwgaW50IGIgPSAyMCwgaW50IGMpOwoJZm9vKDEpOyAgICAgIC8vIG91dHB1dDogZm9vKDEsIDIwLCAzMCkKCQoJdm9pZCBmb28oaW50IGEgPSAxMCwgaW50IGIsIGludCBjKTsKCWZvbygpOyAgICAgICAvLyBvdXRwdXQ6IGZvbygxMCwgMjAsIDMwKQoKCXsKCQkvLyBpbiBpbm5lciBzY29wZXMgd2UgY2FuIGNvbXBsZXRlbHkgcmVkZWZpbmUgdGhlbQoJCXZvaWQgZm9vKGludCBhLCBpbnQgYiA9IDQsIGludCBjID0gOCk7CgkJZm9vKDIpOyAgLy8gb3V0cHV0OiBmb28oMiwgNCwgOCkKCX0KCQoJcmV0dXJuIDA7Cn0=