It's funny that you want to see it as a flaw, while it's the only way that makes sense to me. You simply have a slight case of pointer-phobia.
Languages like Python insist that there is a difference between basic data types and objects, that the former should copy by value, and the latter by reference. But what is a basic data type? Is a list (a builtin data type) basic? It turns out to be no (and it makes sense if you think of how C arrays are just pointers), and every python tutorial has to warn you of that. When are you dealing with reference, and when are you dealing with values? Expect to do some reading.
While in C, we have actual pointers. Your reference is simply syntactic sugar when compared to actual pointers (and pointer to pointers). That means all C structs and basic data types can behave consistently (copying by value). Even pointers themselves are just fancy integers that copy by value. If you want to copy the references, use their addresses. C++ add classes, which are just fancier versions of structs (and thus similarly copy by value) and references, which are just pointers (that also make sure the objects exist). C++ also allows you to redefine the assignment operator itself, which I usually use to disallow copying complex objects by value (which can never hurt). I'm not scared of the power C++ gives me, but I understand many are, and thus I use it sparingly and document it carefully.
Consistency, pointers, deterministic object destruction ... They're why C and C++ rule. You can make the case that they are too difficult for some programmers. But they are great for those who want clarity, control and performance.
Languages like Python insist that there is a difference between basic data types and objects, that the former should copy by value, and the latter by reference. But what is a basic data type? Is a list (a builtin data type) basic? It turns out to be no (and it makes sense if you think of how C arrays are just pointers), and every python tutorial has to warn you of that. When are you dealing with reference, and when are you dealing with values? Expect to do some reading.
While in C, we have actual pointers. Your reference is simply syntactic sugar when compared to actual pointers (and pointer to pointers). That means all C structs and basic data types can behave consistently (copying by value). Even pointers themselves are just fancy integers that copy by value. If you want to copy the references, use their addresses. C++ add classes, which are just fancier versions of structs (and thus similarly copy by value) and references, which are just pointers (that also make sure the objects exist). C++ also allows you to redefine the assignment operator itself, which I usually use to disallow copying complex objects by value (which can never hurt). I'm not scared of the power C++ gives me, but I understand many are, and thus I use it sparingly and document it carefully.
Consistency, pointers, deterministic object destruction ... They're why C and C++ rule. You can make the case that they are too difficult for some programmers. But they are great for those who want clarity, control and performance.