class ExpressionTemplate
{
public:
  ExpressionTemplate() {}
  friend ExpressionTemplate f();
private:
  ExpressionTemplate(const ExpressionTemplate&) {}
  ExpressionTemplate& operator=(const ExpressionTemplate&) {}
};

ExpressionTemplate f() { return ExpressionTemplate(); }

class RealValue
{
public:
  RealValue& operator=(ExpressionTemplate&& x) { return *this; }
  RealValue(ExpressionTemplate&& x) {}
  RealValue() {}
private:
  RealValue& operator=(const ExpressionTemplate& x) { return *this; }
  RealValue(const ExpressionTemplate& x) {}
};

int main()
{
  //auto x = f(); // Good, this throws a compile error.
  RealValue x1 = f(); // Good, this works.
  auto&& x2 = f();
  //RealValue x3 = x2; // Good, this throws a compile error.
  RealValue x4 = static_cast<ExpressionTemplate&&>(x2); // Bad, this compiles.
}