SomeClass a();
Это сигнатура функции, а не объект.
должно быть
SomeClass a; // a is an object
Тогда ваш код действителен.
Почему это законный C ++?
(при условии, что вы исправили предыдущую точку)
Стандарт C ++ говорит, что если ваш атрибут функции является ссылкой, то вы должны предоставить объект, который имеет имя (l-значение). Так вот, это законно. Если бы это была константная ссылка, вы могли бы даже предоставить временное значение (значение r, у которого нет имени).
Функция ожидает ссылку
в SomeClass, но я передаю его
статически размещаемая переменная типа
SomeClass.
Ожидается ссылка на неконстантный экземпляр SomeClass, что вы и предоставили.
Этот экземпляр не статичен, он просто размещен в стеке. Распределение объекта не имеет ничего общего с тем, как им можно манипулировать, только область видимости. То, как объект распределяется (в стеке, как здесь, или в куче с помощью new / delete), только говорит о времени жизни объекта. Даже статический объект может быть передан в вашу функцию, если он не постоянный.
Я думаю, что вы смешиваете некоторые понятия языка здесь ...
Ссылка как указатель нет?
номер
Ссылка - это псевдоним объекта. Не больше, не меньше.
Ладно, на самом деле он реализован в виде указателя со специальными правилами, но это не так во всех случаях: компилятор может реализовать его любым удобным для него способом.
В случае атрибута функции, он часто реализуется как указатель. Но вам даже не нужно об этом знать.
Для вас это просто псевдоним объекта.
Если бы мы должны были заменить ссылку
с указателем компилятор жалуется.
Почему ссылка отличается от
указатель таким образом, что происходит
за кадром?
Полагаю, твоя первая ошибка сделала тебя неясным?