Рассмотрим следующий код:Что означает тип входного аргумента «const double * &»?
void func1(const double& x) {
x = 1.2; //compilation error! (assignment of read-only reference)
}
void func2(const double* x) {
*x = 1.3; //compilation error! (assignment of read-only location)
}
void func3(const double*& x) {
*x = 1.4; //compilation error! (assignment of read-only location)
}
int main()
{
double a = 1.1;
func1(a);
double *y = &a;
func2(y);
func3(y); //compilation error! (invalid initialization of reference of type 'const double*&' from expression of type 'double*')
return 0;
}
Здесь, я понимаю, что func1()
принимает ссылку на двойной, и что func2()
принимает указатель на двойной. В обоих случаях ключевое слово const
означает, что значение double не может быть изменено функцией. Следовательно, я получаю ошибки компиляции, как ожидалось.
Но что же происходит с func3()
? Кажется, я не могу найти объяснения того, что означает этот тип входных аргументов, который бы объяснил ошибки компиляции. Я бы предположил, что const double*& x
означает «ссылка на double*
, которая не может быть изменена». Но это, по-видимому, неверная интерпретация: я не могу отправить double*
(но я могу отправить const double*
), и я могу изменить адрес, на который указывает указатель (но я НЕ МОГУ ИЗМЕНИТЬ double
, что точки указателя к).
Я думаю, что мое замешательство происходит из-за непонимания того, что ключевое слово const
«прикреплено» к: к &
? к double*
? Какова интерпретация const double*& x
, которая позволит устранить мое замешательство?
EDIT: Этот вопрос отличается от предлагаемого дубликата, потому что он в значительной степени связан с тем, как интерпретировать ключевое слово const
«придает».
'const double * &' означает "ссылка на' const double * '". Вы уже знаете, что последнее означает, потому что вы только что описали его: это означает, что хотя указатель может быть изменен, вещь, на которую указывает, не может быть. –
Возможный дубликат [void (\ * (\ * f \ [\])())()] (http://stackoverflow.com/questions/34548762/void-f) –
Также: [cdecl.org] (http://www.cdecl.org) хорошо, если вы не уверены в значении декларации. –