Почему следующая программа выдает ошибку? - PullRequest
3 голосов
/ 05 августа 2010

Почему следующая программа выдает предупреждение?

Примечание : Очевидно, что отправка обычного указателя на функцию, для которой требуется указатель const, не выдает никакого предупреждения.

#include <stdio.h>
void sam(const char **p) { }
int main(int argc, char **argv)
{
    sam(argv);
    return 0;
}

Я получаю следующую ошибку,

In function `int main(int, char **)':
passing `char **' as argument 1 of `sam(const char **)' 
adds cv-quals without intervening `const'

1 Ответ

10 голосов
/ 05 августа 2010

Этот код нарушает правильность const.

Проблема заключается в том, что этот код принципиально небезопасен, поскольку вы можете непреднамеренно изменить объект const.C ++ FAQ Lite имеет прекрасный пример этого в ответе на «Почему я получаю ошибку при преобразовании Foo**Foo const**

class Foo {
 public:
   void modify();  // make some modify to the this object
 };

 int main()
 {
   const Foo x;
   Foo* p;
   Foo const** q = &p;  // q now points to p; this is (fortunately!) an error
   *q = &x;             // p now points to x
   p->modify();         // Ouch: modifies a const Foo!!
   ...
 }

(Пример изДокумент Marshall Cline C ++ FAQ Lite, www.parashift.com / c ++ - faq-lite / )

Вы можете решить проблему, сопоставив оба уровня косвенности:

void sam(char const* const* p) { }
...