# Foo struct

Pathological cases of function attributes.

## Public static functions

static auto constexprStaticFunction() -> int constexpr
  Constexpr before static.
static auto constevalStaticFunction() -> int consteval
  Consteval before static.
static auto staticConstexprFunction() -> int constexpr
  Constexpr after static.
static auto staticConstevalFunction() -> int consteval
  Consteval after static.

## Constructors, destructors, conversion operators

Foo(Foo&&) defaulted noexcept
  Combined default and noexcept.
Foo(const Foo&) noexcept(…)
  Conditional noexcept.

## Public functions

auto operator=(const Foo&) -> Foo& deleted noexcept(…)
  Combined conditional noexcept and delete.
void foo() const pure virtual noexcept(…)
  Const, conditional noexcept and a pure virtual.
auto bar() -> Foo& constexpr noexcept
  Random type and constexpr together.
auto baz() -> decltype(auto) constexpr noexcept
  decltype(auto) and constexpr together

## Function documentation

### static int Foo::constexprStaticFunction() constexpr

Constexpr before static.

1.8.18 puts both `constexpr` and `static` into the return type so I have to remove them. WHY! HOW IS THAT USEFUL IN ANY WAY?!

### static int Foo::constevalStaticFunction() consteval

Consteval before static.

Same as above, but for C++20's consteval.

### static int Foo::staticConstexprFunction() constexpr

Constexpr after static.

In this case, `static` is not in the return type. FFS.

### static int Foo::staticConstevalFunction() consteval

Consteval after static.

Same as above, but for C++20's consteval.

### Foo::Foo(Foo&&) defaulted noexcept

Combined default and noexcept.

Details.

### Foo::Foo(const Foo&) noexcept(…)

Conditional noexcept.

Details.

### Foo& Foo::operator=(const Foo&) deleted noexcept(…)

Combined conditional noexcept and delete.

Details.

### void Foo::foo() const pure virtual noexcept(…)

Const, conditional noexcept and a pure virtual.

Details.

### Foo& Foo::bar() constexpr noexcept

Random type and constexpr together.

This is okay.

### decltype(auto) Foo::baz() constexpr noexcept

decltype(auto) and constexpr together

For some reason, due to decltype(auto), Doxygen swaps the order, causing the constexpr to be hard to detect. Don't even ask how it handles trailing return types. It's just HORRIBLE.