Допустимо модифицировать объект, на который a_
ссылается из b.Compute()
, потому что вы не модифицируете a_
. Создание функции-члена const
означает, что вы не можете изменять значения, хранящиеся в переменных-членах, но это уже невозможно с ссылками (которые никогда нельзя изменить для ссылки на новые объекты).
Ваша ошибка компиляции без флага C ++ 17 не имеет ничего общего с константностью. Прочитайте сообщения об ошибках; они говорят вам, что вы пытаетесь вызвать удаленные конструкторы перемещения / копирования из вашей функции InstantiateA()
, что недопустимо без функции отложенной материализации в C ++ 17.
Скорее всего, у вас выучили все это самостоятельно, если бы вам пришлось собрать минимальный пример .