Boost logo

Boost :

Subject: Re: [boost] [review] Review of Outcome v2 (Fri-19-Jan to Sun-28-Jan, 2018)
From: Niall Douglas (s_sourceforge_at_[hidden])
Date: 2018-02-06 09:15:14


>> When I compile with clang, with -Wall -Wextra -Werror, I get an error
>> saying, "unused variable 'r'". See online examle:
>> https://wandbox.org/permlink/WE7dK6r5XCIxJ83f
>
> IOW, one must use certain tools and options to get the protection.

If you're not using clang-tidy in your project, then you ought to start.
I've managed to raise it on an ancient VS2008 codebase. It surprisingly
works.

> I think the library could, at least, assert in debug builds when a result or outcome is not inspected.

What does "not inspected" mean?

In C and C++, historically when the programmer wishes to signal that
they are intentionally throwing away a result, they write:

```
extern result<int> foo();
...
// I don't care if this succeeds or fails
(void) foo();
```

So okay, perhaps people should do that. But this is something people
definitely do:

```
result<int> r = foo();
if(r)
{
   x = r.value();
   ...
}
```

So now we need to make the explicit boolean operator become non-const in
order to get it to set an internal flag so that the destructor can trip
an assert on uninspected destruction.

Now, I don't mind doing this, indeed I've left a free status bit for
this sort of thing in the future. But are:

- Non-const boolean operator
- Non-const .has_value(), .has_error() etc
- Non-const .value(), .error() etc observers

... a price worth paying for asserting an uninspected result, and this
includes breaking the cast-to-void idiom?

One could of course const cast off any const-ness, and flip the
inspected bit on any form of inspection. But I personally think there is
a much better way that what you propose Rob, and that's to use the
construction hooks to log the construction of result/outcome in debug mode.

This is what I do in my own code. See
https://github.com/ned14/afio/blob/master/include/afio/v2.0/config.hpp#L321.
This lets one detect, much more easily and without breaking behaviour
semantics, unintentionally uninspected outcome/result.

Niall

-- 
ned Productions Limited Consulting
http://www.nedproductions.biz/ http://ie.linkedin.com/in/nialldouglas/

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk