Hacker News new | past | comments | ask | show | jobs | submit login

The constructor error problem is easily solved by using factory functions and two phase construction. The problem is that the standard library is relying on exceptions quite a bit and major parts become unusable.



For what definition of "easy"?

Simply passing by value can result in a constructor that fails, while still bypassing any of the factory functions.


Easy as in "competent C++ programmers do this every day"?

If the copy constructor can fail and you don't want that, then delete it?


> If the copy constructor can fail and you don't want that, then delete it?

You're trivialising just how deeply embedded exceptions are into the design of the language.

I gave just one example and it was not meant to be exhaustive, just one 'gotcha' that you won't find out till runtime and your program starts (worst case) giving you slightly incorrect results without you knowing about it...

So, yeah, if you want to do without exceptions (without having your program execute random code) you need to know in advance what special cases to handle, like unintended copy construction, or failures in overloaded operators, or which std libs can be used and which cannot, or which C++ libraries can be linked, and which cannot.

All of which is perfectly possible, but taken together is hardly "easy". It's tedious, error-prone, bloated ... but hardly what someone would call "easy".


C++ is complicated, I get it. Things that are "easy" in other languages are "hard" in C++. That doesn't mean that writing C++ code that can't throw isn't something that tens of thousands of engineers are doing every day. One could argue that all of C++ is tedious, bloated and error-prone.


it is easy? It is the named constructor idiom.

I don't understand why jupp0r is getting downvoted?

Most big public c++ projects turn off exceptions, so it seems to be the norm more than anything.


Because two phase construction is a widely disliked idiom. Named constructors retuning optional objects are tolerable though.


Two phase construction isn't widely disliked, it's completely fine if it's used as an implementation detail of a factory.


Only the big public C++ projects that blindly follow Google's style guide, mostly.


I don't think this is true, but I don't know this for sure. From what I have read it seems that 'only' Bloomberg, Meta and Microsoft that uses c++ with exceptions.

And since both microsoft and meta are adopting rust in their services it seems to me that they are looking for another language than C++. (why else adopt a new language?)

Following seems not to use exceptions(?)

LLVM: https://llvm.org/docs/CodingStandards.html#do-not-use-rtti-o...

AWS: (seems to be using Google's guidelines to be fair)

Webkit: https://gist.github.com/derofim/df604f2bf65a506223464e3ffd96...

Qt: https://doc.qt.io/qt-6/exceptionsafety.html

gcc: https://gcc.gnu.org/codingconventions.html#Exceptions

Unreal: (not totally sure, but I think it uses error codes internally)

Most of the embedded world. + any console game you ever played or heard of.


LLVM has been for quite some time driven by Apple and Google.

WebKit, another Apple child.

Qt, it has to support environments where exceptions are not allowed, otherwise they would be losing customers, specially since Qt is older than C++98.

gcc, was initially written in C, and for quite long time had a mixed code base with minimal C++.

The companies adopting Rust aren't doing so because of lack of exceptions, they would still adopt Rust if the language had exceptions support (which panic and std::ops::Try kind of are), rather due to the type safety that C and C++ aren't able to provide.

You would be surprised how many games actually do support exceptions.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: