23

In this answer, the following code is given (C++11):

template <typename T, size_t N>
constexpr size_t size_of(T (&)[N]) {
    return N;
}

What does the (&) mean in this context? This sort of thing is exceptionally difficult to search for.

Community
  • 1
  • 1
Phonon
  • 12,549
  • 13
  • 64
  • 114

2 Answers2

19

It's shorthand for something like this:

template <typename T, size_t N>
constexpr size_t size_of(T (&anonymous_variable)[N]) {
    return N;
}

In the function, you don't actually need the name of the variable, just the template deduction on N - so we can simply choose to omit it. The parentheses are syntactically necessary in order to pass the array in by reference - you can't pass in an array by value.

Barry
  • 286,269
  • 29
  • 621
  • 977
5

This is passing an array as a parameter by reference:

template <typename T, size_t N>
constexpr size_t size_of(T (&)[N]) {
    return N;
}

As you cannot pass an array like this:

template <typename T, size_t N>
constexpr size_t size_of(T[N]) {
    return N;
}

If the array was given a name, it would look like:

template <typename T, size_t N>
constexpr size_t size_of(T (&arrayname)[N]) {
    return N;
}
user3476093
  • 704
  • 2
  • 6
  • 11