2016-05-03 19 views
2

Рассмотрим следующий код:Что означает тип входного аргумента «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 «придает».

+3

'const double * &' означает "ссылка на' const double * '". Вы уже знаете, что последнее означает, потому что вы только что описали его: это означает, что хотя указатель может быть изменен, вещь, на которую указывает, не может быть. –

+0

Возможный дубликат [void (\ * (\ * f \ [\])())()] (http://stackoverflow.com/questions/34548762/void-f) –

+3

Также: [cdecl.org] (http://www.cdecl.org) хорошо, если вы не уверены в значении декларации. –

ответ

4

const double*& - ссылка на указатель на двойную константу. Таким образом, *x является константой double, которую вы не можете присвоить. const прилагается к double здесь.

Вы можете использовать либо double* const (который является константным указателем на [неконстантный] двойной) или double* const& (который является ссылкой на константный указатель на [неконстантном] дважды).

3
const double*& x 

означает, что x является ссылкой на указатель на константный дважды, что означает, что объект не может быть изменен (т.е. const является тип классификатор прикреплен к double, а не указатель на объект сам в этом случае)

+0

Спасибо за ответ, я подозревал, как много. Но меня смущает то, что, хотя 'const double * &' является ссылкой на указатель на double, 'const double &' НЕ является ссылкой на double. Как это можно понять? Что касается правила по часовой стрелке? Что-то другое? – andreasdr

+1

@andreasdr 'const double &' Является ссылкой на константу double. –

+0

Я начинаю понимать, что такое мое недоразумение. Благодаря! – andreasdr

2

const double*& x, означает бесконтактную ссылку на const double*.

Когда вы передаете double*, его необходимо отнести к const double*, который является временной переменной и не может быть привязан к неконстантной ссылке, поэтому компилятор жалуется.

BTW: const double* const & x является константой ссылки на const double*.

+0

Спасибо, но в отношении вашей последней точки, разве это не ссылка на константный указатель на double? Хотя выяснение того, что «const» «придерживается», смущает меня до конца, это интерпретация, предложенная http://cdecl.org/ – andreasdr

+1

@andreasdr. Да, точный оператор должен быть «ссылкой на константный указатель на const double» , Поскольку не существует «неконстантной ссылки», которая после инициализации может быть восстановлена ​​до чего-то еще, поэтому мы говорим «const reference» для «ссылки на const» и «non-const reference» для «ссылки на неконстантную». Да, это сбивает с толку ... – songyuanyao

Смежные вопросы