2015-02-02 11 views
3

Я получаю сообщение о передаче несовместимого типа указателя из gcc, когда передаю double ** функции, которая ожидает double double * *. Это меня смущает, поскольку const double ** просто ставит больше ограничений на использование переданного параметра. Как это существенно отличается от передачи double * функции, которая ожидает double double?Почему аргумент типа double ** несовместим с параметром типа const double **

Добавлено позже: Передача double ** в функцию, которая ожидает, что const double * const * также проблематична, любая идея, что может пойти не так для этого?

+0

@ nm этот поток отмечен C++ (ответ отличается от C, к сожалению, хотя некоторые ответы на этот поток делают addres) –

ответ

5

Если вы передадите указатель на const T по значению, функция не сможет отредактировать указатель вызывающего абонента, а также T, поэтому все в порядке.

Если передать указатель на указатель на const T по значению, функция не может изменить T, но может редактировать второй указатель. И так как типы визитных карточек различны (const vs mutable), это может разрушить хаос.

static const double PI = 3.14; 
void function(const double** p) { 
    *p = Π //point at the const double PI 
} 
int main() { 
    double* p; 
    function(&p); //pass pointer to pointer to double 
    *p = -1; //changing a static const global! That's bad! 
} 

Matt McNabb отмечает, что если параметр был const double*const* то C++ позволит, подумал C не происходит, вероятно, из-за простой надзор.

+0

Спасибо, что прояснил ситуацию. Почему я все еще получаю подобное сообщение, если функции ожидают const double * const *? –

+0

@acarchau: Честно говоря, я не знаю. Я думаю, что это должно быть разрешено, но C++ не позволяет это официально. –

+1

@MooingDuck C++ позволяет это, но C не (возможно, недосмотр) –

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