#include <iostream>
using namespace std;
#ifdef _MSC_VER
#define __PRETTY_FUNCTION__ __FUNCSIG__
#endif
class Foo
{
public:
Foo()
{
cout << __PRETTY_FUNCTION__ << endl;
}
Foo(Foo&&)
{
cout << __PRETTY_FUNCTION__ << endl;
}
explicit Foo(const Foo&)
{
cout << __PRETTY_FUNCTION__ << endl;
}
};
void Bar(Foo & a) {}
int main() {
const Foo f;
const Foo &f2 = f;
cout << "@@@@@@+" << endl;
auto lambda = [f2, f3(f2)]() mutable {
Bar(f3); //why f3沒保留const
Bar(f2); //f2確有
};
cout << "@@@@@@-" << endl;
lambda();
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojaWZkZWYgX01TQ19WRVIKI2RlZmluZSBfX1BSRVRUWV9GVU5DVElPTl9fIF9fRlVOQ1NJR19fCiNlbmRpZgpjbGFzcyBGb28KewpwdWJsaWM6CiAgRm9vKCkKICB7CiAgICBjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgZW5kbDsKICB9CiAgRm9vKEZvbyYmKQogIHsKICAgIGNvdXQgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCBlbmRsOwogIH0KICBleHBsaWNpdCBGb28oY29uc3QgRm9vJikKICB7CiAgICBjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgZW5kbDsKICB9Cgp9Owp2b2lkIEJhcihGb28gJiBhKSB7fQppbnQgbWFpbigpIHsKICBjb25zdCBGb28gZjsKICBjb25zdCBGb28gJmYyID0gZjsKICBjb3V0IDw8ICJAQEBAQEArIiA8PCBlbmRsOwogIGF1dG8gbGFtYmRhID0gW2YyLCBmMyhmMildKCkgbXV0YWJsZSB7CiAgICBCYXIoZjMpOyAvL3doeSBmM+aykuS/neeVmWNvbnN0CiAgICBCYXIoZjIpOyAvL2Yy56K65pyJCiAgfTsKICBjb3V0IDw8ICJAQEBAQEAtIiA8PCBlbmRsOwogIGxhbWJkYSgpOwogIC8vIHlvdXIgY29kZSBnb2VzIGhlcmUKICByZXR1cm4gMDsKfQ==
prog.cpp: In lambda function:
prog.cpp:30:11: error: binding 'const Foo' to reference of type 'Foo&' discards qualifiers
Bar(f2); //f2確有
^
prog.cpp:23:6: note: initializing argument 1 of 'void Bar(Foo&)'
void Bar(Foo & a) {}
^
prog.cpp: In function 'int main()':
prog.cpp:28:17: error: cannot bind 'const Foo' lvalue to 'Foo&&'
auto lambda = [f2, f3(f2)]() mutable {
^
prog.cpp:13:3: note: initializing argument 1 of 'Foo::Foo(Foo&&)'
Foo(Foo&&)
^