News for hackers. Stuff that matters.
Re:A brief introduction to C++'s model for type- and resourc... by lmm on Friday January 15, 2016 @12:01PM (#10910506)
The functional approach is great in a language with typeclasses or modules. But it's not a good fit for RAII - how would a C++ constructor report an error using Result?
Re:A brief introduction to C++'s model for type- and resourc... by vvanders on Friday January 15, 2016 @12:07PM (#10910550)
By not doing any work in the constructor.

IMO constructors should be setting sane defaults and nothing more. If you need to do work that could fail put that into an "init()" function with a return type that can signal an error.

I worked for quite a while on platforms that didn't have exceptions and this was the standard pattern for keeping RAII without needing them. If you wrap the return value correctly(like with Result<T,E>) you can also guarantee that your clients need to deal with the error case(or fail to handle it with unwrap()) as opposed to getting caught by an exception that wasn't declared or documented.

Re:A brief introduction to C++'s model for type- and resourc... by lmm on Friday January 15, 2016 @12:24PM (#10910674)
> IMO constructors should be setting sane defaults and nothing more. If you need to do work that could fail put that into an "init()" function with a return type that can signal an error.

That allows you to construct the object in an invalid state. The whole point of RAII is to avoid that. The acronym literally means not having a separate init() function.

Re:A brief introduction to C++'s model for type- and resourc... by vvanders on Friday January 15, 2016 @01:00PM (#10910896)
Sorry, I should have clarified that the init function is usually static so you can invoke with it returning an object + possible error code if you never want an object in an invalid state.

FWIW some quick googling shows that having a constructor acquire a resource is not a requirement(https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Resource_A...). The important part about RAII is that the automatic releasing of resources when out of scope(through a no-throw destructor).

Re:A brief introduction to C++'s model for type- and resourc... by Manishearth on Friday January 15, 2016 @02:32PM (#10911521)
You can solve this problem the Rust way too: don't use a constructor. Create a static `new` method that returns the object to you, with optional error flags.

This is still RAII, you're just not using a constructor to acquire. Rust doesn't have constructors and is still RAII.

Re:A brief introduction to C++'s model for type- and resourc... by pjmlp on Friday January 15, 2016 @01:18PM (#10911029)
While I also don't like the exception handlers in constructors syntax, not putting any work in the constructor doesn't mean that data members or base classes cannot fail to initialize.
Re:A brief introduction to C++'s model for type- and resourc... by steveklabnik on Friday January 15, 2016 @12:59PM (#10910890)
In Rust, we don't have special constructors, just functions, and to construct a struct, all of its members must be valid, and assigned at the same time. So a Rust-style "constructor" in this vein would return a Result<MyStruct, Error>, basically.