繁体   English   中英

(C ++)Const-Reference被修改了吗?

[英](C++) Const-Reference modified?


我正在尝试编写一个字符串类,它可以执行大多数std :: string的操作。 实际上,我坚持使用“插入”功能。

template <typename T>
class string_base {
public:
... 
/// INSERT FUNCTION 
// len = current string length of *this
// cap = current capacity of this->raw_data
// raw_data = array which holds all characters
// DEF_ALLOC = 8192
// T = type of element (char, wchar_t, char16_t, char32_t), in my case: char
// str.data() returns the char array of the "str" parameter 
// str.length() returns "len" variable of "str"

string_base<T> &insert(const string_base<T> &str, unsigned pos) {
    if (pos > len || !str.length()) return *this;
    unsigned o = len;
    if (cap <= (len += str.length())) {
        cap += (str.length() + DEF_ALLOC);
        raw_data = (T *)realloc(raw_data, (cap * sizeof(T)));
    }
    if (pos) {
        for (unsigned i = o; i >= pos; i--)
            raw_data[i + str.length()] = raw_data[i];
    } else {
        for (unsigned i = o; i > 0; i--)
            raw_data[i + str.length()] = raw_data[i];
        raw_data[str.length()] = raw_data[0];
    }
    for (unsigned i = pos; i < (pos + str.length()); i++)
        raw_data[i] = str.data()[i - pos];
    raw_data[len] = 0x00;
    return *this;
}
private:
T *raw_data;
unsigned len, cap;
};

typedef string_base<char> string;
typedef string_base<wchar_t> wstring;
typedef string_base<char16_t> string16;
typedef string_base<char32_t> string32;

我们可以看到函数将一个参数作为一个const-reference(据我所知,这个函数无法改变)我调用了这样的函数:

string_base<char> a("Roses are red"); // assign "Roses are red" to a's char array
string_base<char> b("not "); 
//a.insert(b, 10); -> this works correctly  
a.insert(a, 10); // when I pass "a", it does shit

我在位置10处将“a”插入“a”
“a”(它的字符数组)现在应该具有“玫瑰被玫瑰红色”的值。
相反,它具有“玫瑰玫瑰玫瑰”的价值。
我可能需要补充说函数本身工作正常,我对这个const引用有问题...

我认为“insert”函数也修改了传递的参数,但它不应该。
有什么方法可以预防或解决这个问题吗?

提前致谢! 我希望我的问题很清楚。

您不能通过引用到const修改对象。 这并不意味着您无法通过其他引用修改该对象。

举个简单的例子,以下内容完全有效,并打印“100”:

int main() {
    int i = 42;
    int& ri = i;
    const int& cri = i;

    ri = 100;
    std::cout << cri;
}

通过ri进行的更改通过cri反映,因为它们都指向同一个对象。

你对a.insert(a, 10)调用是相同的情况。 strthis都指向同一个对象。 您对当前对象所做的任何更改也将通过str反映出来。 这意味着当您在重新分配的缓冲区中移动字符时,您正在修改将要复制的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM