4 ms·
What are some of these C++ features that interact in unpredictable ways? Just curious.
by vixeria 15y ago
What are some of these C++ features that interact in unpredictable ways? Just curious.
- jerf 15y agohttp://yosefk.com/c++fqa/defective.html http://yosefk.com/c++fqa/defective.html isn't strictly limited to answering that question, but it touches on it a lot. I know I'm flinging links around a lot here, but, well, this is all well-covered ground.
- thedigitalengel 15y agoMost of the points mentioned in that particular link pertains why both C and C++ are inferior to languages like LISP and Python which have garbage collectors, weak type system and the like. The bitching about bad compile time errors has been mostly fixed in clang. Then only _inconsistency_ (in the correct sense of the term) in C++ I am aware of is the unordered initialization of static objects. So if you have "class A { ... A () { } };" and have a "A foo;" declared somewhere with static linkage, it can be hard to pin down exactly _when_ that constructor will be called. It will be called before control is transferred to main, but you may want even finer control. If you have noticed other inconsistencies I'd love to know.
- jfr 15y ago> The bitching about bad compile time errors has been mostly fixed in clang. Yes, IOW, it is a compiler problem, not a language problem. Because one particular compiler is horrible on error presentation doesn't mean that the language is bad. > declared somewhere with static linkage, it can be hard to pin down exactly _when_ that constructor will be called. The language doesn't define it on purpose. The language leaves it to be defined by the implementation because it goes a little beyond the purpose of the compiler. The compiler transforms C++ source into object code. You can have multiple objects linked together into a single binary, and this linkage is very platform and operating-system dependent. C++ is already horribly difficult to implement correctly; if the language were to define an order for static initialization, it would be stepping on the operating system domain, and make it even more difficult to implement on some systems.
- azth 15y agoI guess that's why the Google C++ style guide lists using static non-POD types as a no-no. :)
- implicit 15y agoImplicit conversions come to mind. They don't need to interact with anything to be confusing. Consider this program: #include <iostream> using std::cout; using std::endl; struct C { int x; C(int _x) : x(_x) {} operator bool() const { return 0 != x; } }; struct D { float f; D(float _f) : f(_f) {} operator bool() const { return 0.0f != f; } }; int main() { C c(9); D d(2.0f); if (c == d) { cout << "Equal" << endl; } return 0; } g++ 3.4.4 doesn't so much as warn that something is fishy here, even with -Wall. Not only that, but c and d are considered to be equal.
- mnutt 15y agoMaybe it's just coming from a dynamic language, but it appears that you've overridden the bool operators to always return true. (except when you pass in 0 and 0.0) If you redefine how two structs of different kinds are compared, who is the compiler to say it's a problem?
- spullara 15y agoIn most dynamic languages 0 is false and anything else is true but it normally wouldn't use that information to coerce two values of different types to booleans before comparing them.
- mnutt 15y agoI'm only aware of php and javascript equating 0 to false. But at any rate in this case it's not equating 0 to false, it's comparing non-zero to zero and returning true. (as it should)
- burgerbrain 15y agoIn C, 0 evaluates to false.
- thedigitalengel 15y ago
- karmafeeder 15y agoCopy constructors are bad. Variable assignment should not be a user defined behaviour.
- malkia 15y agooften it's the implementation for certain platform that limits you, choices of what the C++ supports decides by the platform vendor - for example exceptions, rtti, or even up to date compiler. another provblem arises due to the decoration, mangling of c++ symbols (while c externs do not have this problem), and sometimes this is problem even with two different versions of the same line of compiler another one is the runtime incompabilities (exceptions again) and different compilers. this problem is so bitchy, that if you have to develop plugin for maya, motion builder in c++, you have to use the same compiler the products were compiled with, which is not the case for a lot of the infrastructure, os out there...