Валидно ли передавать ссылку по ссылке в C++?
> ссылок на ссылки
Это не ссылка на ссылку. В функцию b попадет точно такая же ссылка, что и в f. Ссылки ведут себя как "вторые имена" для переменных, поэтому когда вы инициализируете одну ссылку другой, вы просто добавляете в распоряжение еще одно имя для куска памяти. Такого понятия, как ссылка на ссылку в принципе быть не может, в отличие от "указатель на указатель", т.к. указатель сам по себе - реальная самостоятельная переменная с выделенной для нее памятью, на которую, в свою очередь, также можно получить указатель. Ссылка - это запись в таблице идентификаторов компилятора. Да, в зависимости от ситуации для обеспечения ее работы может потребоваться указатель (например, при передаче ссылки в функцию нужно как-то передавать адрес), но этим уже занимается компилятор, поддерживая для вас абстракцию ссылки.
Другое дело - это, как указал Александр Ручкин - время жизни объекта, это другая история. Разумеется, тот объект или значение, ссылку на который мы сформировали, должны "жить", пока к этому объекту идут какие-либо обращения на чтение/запись.
UPD: Кстати, int&& - это НЕ ссылка на ссылку, это r-value ссылка и совсем другая история.
1. UB нет
2. Может
3. inline не влияет
4. Насколько я знаю, нет
Запрет существования ссылок на ссылки - это отсутствие типа (T &) &. Сравни с указателем: тип (T *) * вполне допустим.
Проблема со ссылками может быть, если объект, на который ссылаются, помирает раньше, чем ссылка, напримерstruct foo { foo(int const & x) : x_(x) {}; int const & x_; };

int bar() { return 42; }
void baz() { foo f(bar()); ... } // здесь в foo передается ссылка на временный объект, который умирает в конце выражения, однако ссылка сохраняется в объекте f.
Или прощеstruct foo { foo(int & x) : x_(x) {}; int & x_; };

void foo()
{
  std::shared_ptr<foo> f;
  {
    int x;
    f.reset(new foo(x));
  } // тут x помирает, ссылка на него невалидна
  f->x_ = 10; // UB
}