Date: Sun, 25 Oct 2020 19:50:19 -0500
On Sun, Oct 25, 2020 at 7:41 PM Ryan P. Nicholl via Std-Proposals <
std-proposals_at_[hidden]> wrote:
> I decided to implement a new class based on std::variant. I call it
> "rpnx::derivator", but it's basically "allocating_variant". I tried to make
> it as similar to std::variant as possible. When looking at this, I noticed
> something weird about std::variant. There is no "zero overhead" way to get
> the element contained by the variant, as std::get<I> checks for invalid
> access and throws an exception if invalid. To solve this issue, I would
> like to propose std::as, which works the same as std::get, but accessing
> the wrong type is undefined behavior instead of throwing an exception.
>
> --
> Ryan P. Nicholl
> Tel: (678)-358-7765
> Personal Email: rnicholl_at_[hidden]
> Work Email: ryan.nicholl_at_[hidden]
> Tox:
> 52B3A61CDAF88BCC854F568933F071E3530600CDBA3D5354AADC9AD179575D68021AE959719D
>
You can achieve this by using std::get_if() and marking the nullptr case as
unreachable. For example:
auto f(std::variant<int, double>& v) -> int* {
return std::get_if<int>(&v);
}
auto g(std::variant<int, double>& v) -> int* {
auto p = std::get_if<int>(&v);
if (not p) __builtin_unreachable();
return p;
}
On -O1, f emits a check but g does not: https://godbolt.org/z/9G9fd5.
Barry
std-proposals_at_[hidden]> wrote:
> I decided to implement a new class based on std::variant. I call it
> "rpnx::derivator", but it's basically "allocating_variant". I tried to make
> it as similar to std::variant as possible. When looking at this, I noticed
> something weird about std::variant. There is no "zero overhead" way to get
> the element contained by the variant, as std::get<I> checks for invalid
> access and throws an exception if invalid. To solve this issue, I would
> like to propose std::as, which works the same as std::get, but accessing
> the wrong type is undefined behavior instead of throwing an exception.
>
> --
> Ryan P. Nicholl
> Tel: (678)-358-7765
> Personal Email: rnicholl_at_[hidden]
> Work Email: ryan.nicholl_at_[hidden]
> Tox:
> 52B3A61CDAF88BCC854F568933F071E3530600CDBA3D5354AADC9AD179575D68021AE959719D
>
You can achieve this by using std::get_if() and marking the nullptr case as
unreachable. For example:
auto f(std::variant<int, double>& v) -> int* {
return std::get_if<int>(&v);
}
auto g(std::variant<int, double>& v) -> int* {
auto p = std::get_if<int>(&v);
if (not p) __builtin_unreachable();
return p;
}
On -O1, f emits a check but g does not: https://godbolt.org/z/9G9fd5.
Barry
Received on 2020-10-25 19:50:35