$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: [boost] [system][filesystem v3] A possible error_code argument compromise
From: Scott McMurray (me22.ca+boost_at_[hidden])
Date: 2009-10-27 10:13:21
2009/10/20 Beman Dawes <bdawes_at_[hidden]>:
>
> One particular concern is that as currently worded, the N2838 proposal
> requires throws() return a null reference, which they see as relying
> on undefined behavior.
>
So it sounds like the idea solution is something that looks like a
reference to the caller, for shortness of typing, but looks like a
pointer to the implementation, to ease checking and avoid the
weirdness of null references.
    struct optional_error_code_ref {
        optional_error_code_ref() : p_() {}
        optional_error_code_ref(optional_error_code_ref const &ecr) :
p_(ecr.p_) {}
        optional_error_code_ref(error_code &r) : p_(&r) {}
        error_code &operator*() const { return *p_; }
        error_code *operator->() const { return p_; }
        operator safe_bool() const { return safe_bool(p_); }
      private:
        error_code *p_;
    };
Then the call is done the same was as before:
    error_code ec;
    foo(ec);
But it's obvious to check, and never deals in null references:
    void foo(optional_error_code_ref ec = optional_error_code_ref()) {
        ...
        if (ec) { ec->value = bar; }
        else { throw bar_exception(); }
        ...
    }
It would of course be better spelt qux<error_code&>, but I'm not sure
exactly what name that should be.
~ Scott
(Hopefully the subject change will get us out of the exceptions vs
error codes quagmire.)