#include <iostream>
#include <string>
using namespace std;
struct foo{
string bar;
// foo() = delete; // Nothing changes if this is uncommented
foo(const string& bar) : bar(bar) { }
void operator()(){
cout << "my bar is \"" << bar << '"' << endl;
}
};
void hmm1(string str){
foo(str)(); // Interpreted as 'foo str();', so nothing more
// than a declaration of 'str' as type foo
}
// warning: unused parameter ‘str’ [-Wunused-parameter]
// void hmm1(string str){
void hmm2(string str){
foo(str).operator()(); // Both of these construct a foo object
(foo(str))(); // and call its () operator
}
void hmm3(string str){
foo{str}(); // Same as in hmm2
}
int main(){
hmm1("this is hmm1");
foo("similar format to hmm1")();
hmm2("these are hmm2");
hmm3("this is hmm3");
foo{"similar format to hmm3"}();
return 0;
}
/*
void compilation_error(){
string x("lol");
foo(x)();
}
// error: ‘foo x()’ redeclared as different kind of symbol
// foo(x)();
// ^
// note: previous declaration ‘std::__cxx11::string x’
// string x("lol");
*/
void but_this_is_okay(){
string x("lol");
foo{x}();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IGZvb3sKICBzdHJpbmcgYmFyOwogIC8vIGZvbygpID0gZGVsZXRlOyAvLyBOb3RoaW5nIGNoYW5nZXMgaWYgdGhpcyBpcyB1bmNvbW1lbnRlZAogIGZvbyhjb25zdCBzdHJpbmcmIGJhcikgOiBiYXIoYmFyKSB7IH0KICAKICB2b2lkIG9wZXJhdG9yKCkoKXsKICAgIGNvdXQgPDwgIm15IGJhciBpcyBcIiIgPDwgYmFyIDw8ICciJyA8PCBlbmRsOwogIH0KfTsKCnZvaWQgaG1tMShzdHJpbmcgc3RyKXsKICBmb28oc3RyKSgpOyAgICAgICAgICAgICAvLyBJbnRlcnByZXRlZCBhcyAnZm9vIHN0cigpOycsIHNvIG5vdGhpbmcgbW9yZQogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gYSBkZWNsYXJhdGlvbiBvZiAnc3RyJyBhcyB0eXBlIGZvbwp9Ci8vIHdhcm5pbmc6IHVudXNlZCBwYXJhbWV0ZXIg4oCYc3Ry4oCZIFstV3VudXNlZC1wYXJhbWV0ZXJdCi8vICB2b2lkIGhtbTEoc3RyaW5nIHN0cil7CnZvaWQgaG1tMihzdHJpbmcgc3RyKXsKICBmb28oc3RyKS5vcGVyYXRvcigpKCk7ICAvLyBCb3RoIG9mIHRoZXNlIGNvbnN0cnVjdCBhIGZvbyBvYmplY3QgCiAgKGZvbyhzdHIpKSgpOyAgICAgICAgICAgLy8gYW5kIGNhbGwgaXRzICgpIG9wZXJhdG9yCn0Kdm9pZCBobW0zKHN0cmluZyBzdHIpewogIGZvb3tzdHJ9KCk7ICAgICAgICAgICAgIC8vIFNhbWUgYXMgaW4gaG1tMgp9CmludCBtYWluKCl7CiAgaG1tMSgidGhpcyBpcyBobW0xIik7CiAgZm9vKCJzaW1pbGFyIGZvcm1hdCB0byBobW0xIikoKTsKICAKICBobW0yKCJ0aGVzZSBhcmUgaG1tMiIpOwoKICBobW0zKCJ0aGlzIGlzIGhtbTMiKTsKICBmb297InNpbWlsYXIgZm9ybWF0IHRvIGhtbTMifSgpOwoKCXJldHVybiAwOwp9CgoKLyoKdm9pZCBjb21waWxhdGlvbl9lcnJvcigpewogIHN0cmluZyB4KCJsb2wiKTsKICBmb28oeCkoKTsKfQovLyBlcnJvcjog4oCYZm9vIHgoKeKAmSByZWRlY2xhcmVkIGFzIGRpZmZlcmVudCBraW5kIG9mIHN5bWJvbAovLyAgICBmb28oeCkoKTsKLy8gICAgICAgICAgIF4KLy8gbm90ZTogcHJldmlvdXMgZGVjbGFyYXRpb24g4oCYc3RkOjpfX2N4eDExOjpzdHJpbmcgeOKAmQovLyAgICBzdHJpbmcgeCgibG9sIik7CiovCgp2b2lkIGJ1dF90aGlzX2lzX29rYXkoKXsKICBzdHJpbmcgeCgibG9sIik7CiAgZm9ve3h9KCk7Cn0=