代码之家  ›  专栏  ›  技术社区  ›  josh

为什么下面的程序会出错?

  •  3
  • josh  · 技术社区  · 14 年前

    注意 :很明显,向需要常量指针的函数发送普通指针不会给出任何警告。

    #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 回复  |  直到 14 年前
        1
  •  10
  •   James McNellis    14 年前

    此代码违反const正确性。

    "Why am I getting an error converting a 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/ )

    您可以通过const限定两个间接寻址级别来解决此问题:

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