/*
 * Copyright ©2026 Soham Pardeshi. All rights reserved.
 * Permission is hereby granted to students registered for University of
 * Washington CSE 333 for use solely during Summer Quarter 2026 for
 * purposes of the course. No other use, copying, distribution, or
 * modification is permitted without prior written consent. Copyrights
 * for third-party components of this work must be honored. Instructors
 * interested in reusing these course materials should contact the author.
 */

#include <iostream>   // for std::cout, std::endl
#include <cstdlib>    // for EXIT_SUCCESS

using std::cout;
using std::endl;

// auto asks the compiler to deduce the type.  By default it deduces the
// VALUE type: it copies, and strips top-level const and references.  Add
// const and & back yourself when you want a cheap, read-only view.

int main(int argc, char** argv) {
  int x = 5;
  const int y = 6;

  auto a = y;         // a is int   (const dropped, and it is a copy)
  a += 1;             // OK: a is a plain, modifiable int

  const auto b = y;   // b is const int
  // b += 1;          // ERROR: b is const

  const auto& c = x;  // c is a const int&: no copy, read-only view of x
  // c += 1;          // ERROR: c is a const reference

  cout << "a = " << a << ", b = " << b << ", c = " << c << endl;  // 7, 6, 5
  return EXIT_SUCCESS;
}

// Compile with:
//   g++ -Wall -g -std=c++17 -o auto auto.cc