{
        obs_.moved();
    }
    Observer& obs_;
};

TEST_CASE("invoker arguments move and copy", "[invoker]")
{
    SECTION("arguments will be copied when creating invoker from values")
    {
        auto funcByValue = [](ObservedObject) {};
        Observer obs;
        ObservedObject obj(obs);
        auto invoker = make_invoker(funcByValue, obj);
        REQUIRE(obs.copied_times() == 1);
        REQUIRE(obs.moved_times() == 0);
    }

    SECTION("arguments will be moved when creating invoker from moved values")
    {
        auto funcByValue = [](ObservedObject) {};
        Observer obs;
        ObservedObject obj(obs);
        auto invoker = make_invoker(funcByValue, std::move(obj));
        REQUIRE(obs.copied_times() == 0);
        REQUIRE(obs.moved_times() == 1);
    }

    SECTION("arguments will be moved when invoking the underlying function")
    {
        auto funcByValue = [](ObservedObject) {};