Skip to content

Latest commit

 

History

History
121 lines (89 loc) · 2.08 KB

307.md

File metadata and controls

121 lines (89 loc) · 2.08 KB
Info

Example

struct s {
  static constexpr auto operator[]() { return 42; }
};

static_assert(42 == s{}[]);
static_assert(42 == s::operator[]());

https://godbolt.org/z/GzTc3MxPE

Puzzle

  • Can you provide an example which shows that static operator[] requies less assembly instructions than non-static version?

Solutions

struct foo {
    static auto operator[]() -> int;
};

struct bar {
    auto operator[]() const -> int;
};

auto get(const int, const foo &o) { return o[]; }
auto get(const int, const bar &o) { return o[]; }

https://godbolt.org/z/ThP4jnoa7

struct X { static void operator[](); };
struct Y { void operator[]() const; };

auto fn1() { X{}[]; }
auto fn2() { Y{}[]; }

https://godbolt.org/z/e4xcG9aKv

struct s {
  static constexpr auto operator[]() { return 42; }
};

static_assert(42 == s{}[]);
static_assert(42 == s::operator[]());

struct ns {
    constexpr auto operator[](){ return 42; }
};

static_assert(42 == ns{}[]);

int main() {
    s{}[];
    ns{}[];

};

https://godbolt.org/z/cEq6ET3W5

struct foo {
    static auto operator[]() -> int;
};

struct bar {
    auto operator[]() const -> int;
};

template<typename ...Ts>
struct getter
{
   int operator()() const
   {
       return std::apply([](Ts const &... args ){ return (args[] +...);},t);
   }
   std::tuple<Ts...> t;
};

int get(getter<foo,foo,foo,foo,foo> const & g){ return g();}
int get(getter<bar,bar,bar,bar,bar> const & g){ return g();}

https://godbolt.org/z/obxWar47n

// static version
struct s {
    static constexpr auto operator[](int i) { return 42; }
};
int main(){
    return s::operator[](0);
}

https://godbolt.org/z/bjKccWG7M

// static version
struct s {
    static void operator[]();
};
auto fn(){
    s::operator[]();
}

https://godbolt.org/z/4zxYP5WaG