【问题标题】:Explain: Converting 'char **' to 'const char **', Conversion loses qualifiers [duplicate]说明:将 'char **' 转换为 'const char **',转换丢失限定符 [重复]
【发布时间】:2012-04-30 12:48:26
【问题描述】:

可能重复:
Implicit cast from char** to const char**

给定以下代码:

void foo( const char ** buffer );

void bar() 
{
    char * buffer;
    foo( &buffer );
}

为什么如果foo() 函数有const char * 参数,编译器在传入char * 变量时不会报错?但是当使用char **时,它无法将其转换为const char **?编译器是否在前一种情况下添加任何const 限定符?

我已经阅读了 C++ 标准的第 4.4 节,这让我更加困惑。

【问题讨论】:

    标签: c++ casting constants


    【解决方案1】:

    是的,您不能从 T ** 隐式转换为 const T **,因为编译器不能再保证不会违反 const-ness。

    考虑以下代码(借自 C 常见问题解答中关于此主题的问题:Why can't I pass a char ** to a function which expects a const char **?):

    const char c = 'x';
    char *p1;
    const char **p2 = &p1;  // 3
    *p2 = &c;
    *p1 = 'X';              // 5
    

    如果编译器允许第 3 行,那么第 5 行将最终写入 const 对象。

    【讨论】:

    • 如何修改以上代码才能正常编译?
    • @MarkP, foo( const_cast<const char **>(&buffer) ); 应该可以工作。对我来说这很奇怪,但标准允许const_cast 在任何方向上在具有不同 cv-qualification 的类型之间进行转换。因此,您可以通过它删除const 资格,也可以根据需要添加。
    【解决方案2】:

    考虑:

    char const someText[] = "abcd";
    
    void
    foo( char const** buffer )
    {
        *buffer = someText;
    }
    
    void
    bar()
    {
        char* buffer;
        foo( &buffer );
        *buffer = 'x';
    }
    

    如果这是合法的,就可以修改一个 const 对象 没有干预const_cast。禁止转换 因为它违反了 const-ness。

    【讨论】:

      【解决方案3】:

      您可能对 const 适用的间接级别感到困惑。

      char** 可以描述为pointer to a pointer to a character,而const char** 可以描述为pointer to a pointer to a constant character

      所以当我们以不同的方式编写时,我们有pointer to AA = pointer to character)和pointer to BB = pointer to a constant character)。

      现在显然(我希望)A 和 B 是不同的类型,因为不能将指向 A 的指针分配给指向 B 的指针(反之亦然)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 2011-05-17
        • 2020-05-08
        • 2013-12-31
        • 2012-01-16
        • 1970-01-01
        相关资源
        最近更新 更多