These "factory functions" are indeed possible, but in practice I've seen the "delayed initialization" done in most places I've worked. Where I'm currently working, a common "drive-by PR" I do on others' code as I'm reading through it is the "you forgot to add the is_this_initializated? check on this method". It's not really until someone on the team has been burned by this partially-complete-but-still-validish objects gets used before Initialize() has been called and invokes very weird behavior do people get serious about this :(
Though not common, this factory function method does not work for immovable types. You can't yoink these types out of the optional<T> that's returned and put them in a vector<T>, for instance.