As Herb and Andrei and I determine the topics we’ll address in our technical sessions at C&B 2012, we’ll post them here. We’ll also post topics we may discuss–prospective sessions. In both cases, we welcome your feedback. What follows is the first session announcement for C++ and Beyond 2012.

Universal References in C++11

T&& Doesn’t Always Mean Rvalue Reference

Perhaps the most significant new feature in C++11 is rvalue references; they’re the foundation on which move semantics and perfect forwarding are built. An rvalue reference is declared like a “normal” reference (now known as an lvalue reference), except you use two ampersands instead of one, i.e., “ T&& ” instead of “ T& ”. A reasonable expectation would be that if you see a type declaration involving “ && ”, you’re looking at an rvalue reference, but that’s not the case:

int && var1 = 10; // here, “&&” means rvalue reference auto && var2 = var1; // here, “&&” does not mean // rvalue reference template<typename T> void f(std::vector<T> && param); // here, “&&” means rvalue reference template<typename T> void f(T && param); // here, “&&” might mean // rvalue reference

In this talk, I describe the two meanings of “ && ” in type declarations, explain how to tell them apart, and introduce new terminology that makes it possible to unambiguously communicate which meaning of “ && ” is intended. Distinguishing the different meanings is important, because if you think “rvalue reference” when you see “ && ” in a type declaration, you’ll misread a lot of C++11 code.

Our journey through DoubleAmpersandVille will include some interesting sights, including glimpses of the three different sets of type deductions rules in C++11, why “ const T&& ” does far more than just add const to “ T&& ”, how the token sequence “ T&& ” (where T is a template type parameter) can have completely different meanings in different function templates, and what decltype has in common with auto and templates. It’ll be a fun, illuminating ride, and by the time it’s over, you’ll be able to distinguish rvalue references from their syntactic twins with aplomb.

Scott