few days ago i've pointed out that overloading on rvalue reference to this looks non-obvious at first. Scott explained that it is to preserve backward compatibility, as legacy code did call methods on both lvalues and rvalues, so & (aka: lvalue) overload cannot be the default. instead, you have default behavior of “match all” or you can explicitly choose “rvalue/lvalue split”. of course you cannot have both. obvious, once you learn that. :)