Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

> Constructors are simply not meant to fail. You should never do something like io in a constructor. For everything more complicated than setting some fields a factory is better suited.

How would you reconcile that with the fact that std::vector<T>::vector() is explicitly permitted to fail? [1] Do you construct your std::vector<T> objects with factories too?

> Exceptions: Calls to Allocator::allocate may throw.

[1] https://en.cppreference.com/w/cpp/container/vector/vector



> Do you construct your std::vector<T> objects with factories too?

I usually do it like that:

    try
    {
        vec.resize( wantedSize );
    }
    catch( const std::bad_alloc& )
    {
        return E_OUTOFMEMORY;
    }


Yeah but that's completely avoiding my point. You're claiming constructors aren't supposed to throw, but I'm pointing out the standard explicitly lets vector's constructors fail, and there's no other mechanism to handle that failure than by catching the exception (it's literally designed that way). It's fine if you prefer not to use those constructors in the first place, but that's kind of beside my point about what constructors are "supposed" to do.


> but I'm pointing out the standard explicitly lets vector's constructors fail

Yeah, but that thing has more than one constructor. Since C++/17, the default constructor of std::vector which doesn’t allocate any storage is usually marked as noexcept, i.e. the standard does not allow it to throw anything. This feature allows to make classes which contain vectors yet don’t throw exceptions from constructors.

P.S. The move constructor of std::vector is marked with noexcept as well, i.e. it’s even possible to construct non-empty vectors without any exceptions.





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

Search: