Repository: microsoft/terminal
File: src/inc/til/winrt.h (C/C++)

Code before:
            _value = other._value;
            return *this;
        }
        property<T>& operator=(const T& newValue)
        {
            _value = newValue;
            return *this;
        }

    private:
        T _value;
    };

#ifdef WINRT_Windows_Foundation_H

    template<typename ArgsT>
    struct event
    {
        event<ArgsT>() = default;
        winrt::event_token operator()(const ArgsT& handler) { return _handlers.add(handler); }
        void operator()(const winrt::event_token& token) { _handlers.remove(token); }
        template<typename... Arg>
        void raise(Arg const&... args)
        {
            _handlers(args...);
        }
        winrt::event<ArgsT> _handlers;
    };

    template<typename ArgsT>
    struct forwarded_event
    {
        forwarded_event<ArgsT>() = delete;
        forwarded_event<ArgsT>(event<ArgsT>& other) :
            _origin{ other } {}
        forwarded_event<ArgsT>(forwarded_event<ArgsT>& other) :
            _origin{ other._origin } {}

        winrt::event_token operator()(const ArgsT& handler) { return _origin(handler); }
        void operator()(const winrt::event_token& token) { _origin(token); }
        template<typename... Arg>
        void raise(Arg const&... args)
        {
            _origin.raise(args...);
        }
        event<ArgsT>& _origin;
    };

    template<typename SenderT, typename ArgsT>
    struct typed_event
    {

Review comment (suggestion):
You should use `&&` to support moving parameters. Just like above you have to re-move them again though, because `&&` is fake. So it'd be something like this:
```cpp
void raise(auto&&... args)
{
    _handlers(std::forward<decltype(args)>(args)...);
}
```

Code after:
            }
            else
            {
                return _value;
            }
        }
        bool operator==(const property& other) const noexcept
        {
            return _value == other._value;
        }
        bool operator!=(const property& other) const noexcept
        {
            return _value != other._value;
        }
        bool operator==(const T& other) const noexcept
        {
            return _value == other;
        }
        bool operator!=(const T& other) const noexcept
        {
            return _value != other;
        }

    private:
        T _value;
    };

#ifdef WINRT_Windows_Foundation_H

    template<typename ArgsT>
    struct event
    {
        event<ArgsT>() = default;
        winrt::event_token operator()(const ArgsT& handler) { return _handlers.add(handler); }
        void operator()(const winrt::event_token& token) { _handlers.remove(token); }
        operator bool() const noexcept { return _handlers; }
        template<typename... Arg>
        void raise(auto&&... args)
        {
            _handlers(std::forward<decltype(args)>(args)...);
        }
        winrt::event<ArgsT> _handlers;
    };

    template<typename SenderT, typename ArgsT>
    struct typed_event
    {
        typed_event<SenderT, ArgsT>() = default;
        winrt::event_token operator()(const winrt::Windows::Foundation::TypedEventHandler<SenderT, ArgsT>& handler) { return _handlers.add(handler); }
        void operator()(const winrt::event_token& token) { _handlers.remove(token); }
        operator bool() const noexcept { return _handlers; }