diff mbox

[v3,variant] user-defined operator& and std::variant

Message ID CAAihzV+nO8URZntPsNQG5udZEkUrKm3YQKwT=D5mB7qGTF7AYA@mail.gmail.com
State New
Headers show

Commit Message

Mikhail Strelnikov Sept. 3, 2016, 7:46 p.m. UTC
Hello,

Following code does not compile,

#include <variant>

namespace n
{
    template<typename T>
    void operator&(T) {}
    struct s{};
}

int main()
{
    std::variant<n::s> v;
    std::get<n::s>(v);
}

error: include/c++/7.0.0/variant:315:4: error: invalid static_cast

Comments

Tim Shen Sept. 5, 2016, 7:44 p.m. UTC | #1
On Sat, Sep 3, 2016 at 12:46 PM, Mikhail Strelnikov wrote:
> Hello,
>
> Following code does not compile,
>
> #include <variant>
>
> namespace n
> {
>     template<typename T>
>     void operator&(T) {}
>     struct s{};
> }
>
> int main()
> {
>     std::variant<n::s> v;
>     std::get<n::s>(v);
> }
>
> error: include/c++/7.0.0/variant:315:4: error: invalid static_cast
>
> diff -r -u a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant
> --- a/libstdc++-v3/include/std/variant 2016-08-26 13:34:30.823029400 +0300
> +++ b/libstdc++-v3/include/std/variant 2016-09-03 18:01:26.431299300 +0300
> @@ -312,7 +312,7 @@
>        _M_storage() const
>        {
>   return const_cast<void*>(
> -  static_cast<const void*>(&_M_first._M_storage));
> +  static_cast<const void*>(std::__addressof(_M_first._M_storage)));
>        }
>
>        union

Thanks for the patch! Tested on x86_64-linux-gnu and committed as r239996.

I changed std::__addressof to std::addressof since it's standardized
since C++11.
diff mbox

Patch

diff -r -u a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant
--- a/libstdc++-v3/include/std/variant 2016-08-26 13:34:30.823029400 +0300
+++ b/libstdc++-v3/include/std/variant 2016-09-03 18:01:26.431299300 +0300
@@ -312,7 +312,7 @@ 
       _M_storage() const
       {
  return const_cast<void*>(
-  static_cast<const void*>(&_M_first._M_storage));
+  static_cast<const void*>(std::__addressof(_M_first._M_storage)));
       }

       union