C ++:为什么我可以将指针值成员变量从const成员函数传递给采用非const指针参数的外部函数?

紫杉

我正在使用外部库中的函数(此处由printer-function表示)。
我注意到,偶然地,我可以constprint()-function一样通过成员函数传递类成员即使我使用

g++ -Wall -Wextra -Wpedantic -Werror -o test test.cpp

我没有得到一个错误。

这似乎是非常错误的,因为实际上我正在通过调用const成员函数来修改对象为什么编译器不抱怨?这是代码:

#include <iostream>
using namespace std;

void printer(void* data) {
    static_cast<char*>(data)[0] = '1';
    cout << static_cast<char*>(data) << endl;
}

void setUp(char* data, int length) {
    for(int i=0; i<length; i++)
        data[i] = '0';
    data[length] = '\0';
}

class Test {
    private:
        char* data;

    public:
        Test(int length) {
            data = new char(length+1);
            setUp(this->data, length);
        }

        ~Test() {
            delete data;
        }

        void print() const {
            printer(this->data);
        }
};

int main() {
    Test T(3);
    T.print();
    return 0;
}

我最好的猜测是,编译器仅保证指针变量不会被修改,即函数调用后不会指向其他物理地址。但是我也注意到,当我尝试用astd::vector<char>代替char*and修改后的print-function时,编译器会抛出错误

void print() const {
    printer(this->myVector.data());
}

因此,如果我的猜测是正确的,为什么不能对data()STL向量获得的指针做类似的事情

无用
  1. 您有一个char *数据成员。

  2. 在const限定方法的上下文中,这意味着该成员可能不会发生突变。

  3. 成员是指针。更改指针意味着更改其指向的位置。

  4. 需要明确的是,方法内部的有效限定类型是

     char * const
    

    不是

     const char *
    
  5. 这全是为了确认您绝对正确

    我最好的猜测是,编译器仅保证指针变量不会被修改,即在函数调用之后不指向其他地址。

但是,对于矢量而言,您想要在具有有效限定类型的对象上调用数据std::vector<char> const&...因此,您需要的const限定重载std::vector::data,并返回const char*首先,这是您所期望的,但是它与原始指针的行为不同。

造成这种差异的原因是向量是为了表示该数据的所有权而编写的,因此const向量应具有const内容。原始指针可能拥有它们指向的数据,但是无法表达这一点,也没有办法对拥有和不拥有原始指针具有不同的const行为。这是在可能的情况下避免使用原始指针的可能原因之一。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章