Так то цей код взагалі не має скомпілюватися, бо fn(s) має викликати fn(S&), що з однаковим успіхом каститься як до 0, так і до 2, але суть ти зрозумів
In function 'int main()': 27:9: error: call of overloaded 'fn(S&)' is ambiguous 27:9: note: candidates are: 10:6: note: void fn(S) 14:6: note: void fn(S&&) <near match> 14:6: note: no known conversion for argument 1 from 'S' to 'S&&' 18:6: note: void fn(const S&)