c++ - 添加具有 size_t 类型值的指针

标签 c++ pointers types size-t

class CheckPointer {
public:
    CheckPointer(int * mbeg, int * mend) :
        beg(mbeg), end(mend), curr(mbeg) {}

    // subscript operator
    int & operator[] (const size_t pos) {
        if (beg + pos < beg) {
            throw out_of_range("ERR: before beg!");
        }
        if (beg + pos >= end)
            throw out_of_range("ERR: end or past end!");
        return *(const_cast<int *>(beg + pos));
    }
private:
    const int * beg;
    const int * end;
    int * curr;
};

我已经为 CheckPointer 类定义了一个下标运算符。由于@param pos 是 size_t 类型,我无法检查用户传递的是正值还是负值。但是我尝试编写代码来进行绑定(bind)检查并且它有效:

        if (beg + pos < beg) {
            throw out_of_range("ERR: before beg!");
        }

我不知道它为什么有效...有人可以帮助我吗?

感谢您考虑我的问题!


更多信息:

环境:eclipse CDT,Ubuntu 10.04

测试代码:

int iarr[6] = {1, 2, 3, 4, 5, 6};
CheckPointer cp(iarr, iarr+6);
// subscript
cout << cp[2] << endl;
cout << cp[5] << endl;
cout << cp[-2] << endl; // error: before beg

测试代码输出:

terminate called after throwing an instance of 'std::out_of_range'
  what():  ERR: before beg!
3
6

最佳答案

这是有效的,因为负值被转换为无符号值。您的机器架构可能对负值使用二进制补码,因此 -2 的值会导致:

0xfffffffe (assuming 32-bit)

当您将此添加到 beg 时,它环绕并提供 beg 大于或等于 2,具有从中减去 2 的效果。因此,尽管索引非常大,但它本质上是做了一个减法。如果 beg 的值为 10,则错误将改为“past end”。

关于c++ - 添加具有 size_t 类型值的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556094/

相关文章:

c - while 循环中奇怪的指针行为

c++ - 配对作为 map 中的键以进行内存

node.js - @Types/Sequelize 错误 TS1086 : An accessor cannot be declared in ambient context

C++从文件加载不断重复最后一个字符

c++ - 使用 QT Creator 环境使用 QT 4.5 实现拖放

c++ - 使用 acm 将 Ogg 转为 Riff/Wave 编码

c++ - Qt:在默认浏览器中打开带有目标的链接,不会泄漏内存

c - C 中的线性间隔数组

C++:将指针的指针传递给函数

scala - 我可以将 'nesting' 与 Scala 抽象类型一起使用来简化类定义吗?