RSS Amplifier

Matthew Brecknell · Aug 2, 2013

C++11 universal reference pop-quiz

0
Sign in to vote or save

matthew.brecknell.net

Here’s a little exercise for anyone who, like me, recently came across Scott Meyerswork on universal references in C++11: Is the following program well formed? Does it have well-defined behaviour? If not, why not? If so, what is the value returned by main()? Why? References, please!

template <typename R>
struct wat;
template <typename T>
struct wat <T&> {
  static int value(T & t) { return t * 1; }
};
template <typename T>
struct wat <T&&> {
  static int value(T && t) { return t * 3; }
};
template <typename T>
struct ref {
  ref(T && t) : t(static_cast<T&&>(t)) {}
  int value() { return wat<T&&>::value(static_cast<T&&>(t)); }
  T && t;
};
template <typename T>
ref<T> uni(T && t) {
  return ref<T>(static_cast<T&&>(t));
}
int main() {
  int i(3);
  return uni(i).value() + uni(13).value();
}

I have written the program so that it needs no #include directives, and therefore you can be sure there is not a single typedef, decltype or auto specifier anywhere in or out of sight. That means there’s only one way that so-called universal references can arise.

However, you might find one or two other little surprises. Oh, and Clang 3.3 and GCC 4.8.1 don’t even agree on this program, so there’s not much point in cheating!

Read the original on matthew.brecknell.net

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.