Если C тег можно верить, НКУ генерирует предупреждение, как типы различаются как для вашего примера и const double * const * const * d
. В C++ это ошибка в коде OP, но подход slap-const-all является законным.
Причина, по которой компилятор предупреждает вас, заключается в том, что указатель на указатель (или дальнейшая косвенность) позволяет возвращать указатель вызывающему, изменяя местоположение, на которое указывает параметр.
Если цель указателя объявлена как const, тогда вызываемая функция будет ожидать, что значение, которое оно помещает, должно рассматриваться как const при возврате.
Более простой случай прохождения T**
к const T**
, который иллюстрирует, почему это ошибка будет:
void foo (const char ** z)
{
*z = "A";
}
int main (int nargs, char** argv)
{
char* z = 0;
char** d = &z;
// warning in C, error in C++
foo (d);
// bad - modifies const data
z[0] = 'Q';
}
const
в C означает, что данные не изменится. const
в C++ означает, что данные не будут меняться публично - изменчивые данные в объекте C++ могут измениться. Компилятор AC мог бы оптимизировать свой код, чтобы он кэшировал некоторые из данных const
где-то, но компилятор C++ не может этого сделать из-за возможной мутабельности, поэтому имеет более слабое ограничение, что вы не можете вернуть данные const неконстантным, как указано выше , Таким образом, в C++ double***
может быть отлит до const double * const * const * d
, поскольку дополнительные const
предотвращают возврат немодифицируемой памяти, но в C он генерирует предупреждение и возможные ошибки, если компилятор оптимизирует повторный доступ к памяти в другом месте.
, имеющий вопрос с тегами как с C, так и с C++, когда правила относительно того, что является ошибкой и что допускается, различаются, создает некоторую путаницу. –
@ Пойди, ты прав. Я - компилятор usigng C для этого примера. Действительно ли правила в этом отношении разные? – vehomzzz