cpp: most vexing parse

This commit is contained in:
Ciro Santilli 六四事件 法轮功
2020-02-27 00:00:04 +00:00
parent d67a81cee3
commit 75b081f171
2 changed files with 61 additions and 0 deletions

View File

@@ -14475,6 +14475,10 @@ Programs under link:userland/cpp/[] are examples of https://en.wikipedia.org/wik
** associative ** associative
*** <<algorithms>> contains a benchmark comparison of different c++ containers *** <<algorithms>> contains a benchmark comparison of different c++ containers
*** link:userland/cpp/set.cpp[]: `std::set` contains unique keys *** link:userland/cpp/set.cpp[]: `std::set` contains unique keys
* Language madness
** link:userland/cpp/most_vexing_parse.cpp[]: the most vexing parse is a famous constructor vs function declaration syntax gotcha!
*** https://en.wikipedia.org/wiki/Most_vexing_parse
*** http://stackoverflow.com/questions/180172/default-constructor-with-empty-brackets
[[cpp-multithreading]] [[cpp-multithreading]]
==== C++ multithreading ==== C++ multithreading

View File

@@ -0,0 +1,57 @@
// https://cirosantilli.com/linux-kernel-module-cheat#cpp
#include "common.hpp"
int main() {
struct C {
int i;
C() : i(1) {}
C(int i) : i(i) {}
};
struct D {
D() {}
};
// Declares *FUNCTION* called `c` that returns `C` inside function main.
//
// This is the same as in C, where it is possible to declare a function from inside another function,
// but not define it.
//
// Therefore there would be not way for C++ to distinguish between the two,
// and still be backwards compatible with C.
{
C c();
#if 0
// ERROR: function definition is not possible inside another function.
C c() {return C();}
#endif
//c.i;
}
// If you want to call a default constructor, use:
{
C c;
assert(c.i == 1);
}
// For non-default constructors, literal arguments disambiguate
// things as this syntax could not possibly be a function declaration.
{
C c(2);
assert(c.i == 2);
}
// But sometimes even arguments are not enough: here D()
// could matn that the declared `c`
{
C c(D());
#if 0
// error: request for member i in c, which is of non-class type main()::C(main()::D (*)())
assert(c.i == 2);
#endif
}
}