РЕДАКТИРОВАТЬ: Я экспериментировал с некоторыми, и обнаружил, что вещи немного тоньше, чем я думал. Вот то, что я сейчас считаю точным ответом.
&s
не является lvalue, поэтому вы не можете создать ссылку на него, если тип ссылки не является ссылкой на const
. Так, например, вы не можете сделать
string * &r = &s;
но вы можете сделать
string * const &r = &s;
Если вы поместите аналогичное объявление в заголовок функции, оно будет работать.
void myfunc(string * const &a) { ... }
Есть еще одна проблема, а именно временные. Правило заключается в том, что вы можете получить ссылку на временный объект, только если он равен const
. Так что в этом случае можно утверждать, что & s является временным, и поэтому должно быть объявлено const
в прототипе функции. С практической точки зрения это не имеет значения в этом случае. (Это либо значение, либо временное значение. В любом случае, применяется то же правило.) Однако, строго говоря, я думаю, что это не временное значение, а значение. Интересно, есть ли способ отличить их? (Возможно, просто определено, что все временные значения являются r-значениями, а все ненулевые значения являются временными значениями. Я не специалист по стандарту.)
При этом ваша проблема, вероятно, находится на более высоком уровне. Почему вы хотите ссылку на адрес s
? Если вы хотите ссылку на указатель на s
, вам нужно определить указатель как в
string *p = &s;
myfunc(p);
Если вам нужна ссылка на s
или указатель на s
, сделайте это просто.