unique_ptr的增量导致用户定义的运算符出现意外行为!=

问题描述 投票:0回答:1

这是一个非常具体的问题,需要解释很长一段时间,因此,请尽我所能,尽可能地总结一下。

我创建了2个用户类型,第一个在第二个内部使用:

struct mySubType {
    int val;
    mySubType () {}
    mySubType ( int _val) : val(_val){}
    bool operator!=(const mySubType& rhs) const { return val != rhs.val; }
};

struct myType {
    mySubType start;
    mySubType stop;
    myType () {}
    myType (mySubType _start, mySubType _stop) : start(_start), stop(_stop) {}
};

main()中,创建vectorunique_ptrmyType,并按如下方式填充它:

vector<unique_ptr<myType>> v;

for (int i = 0; i < 10; ++i)
    v.push_back( unique_ptr<myType>(new myType( mySubType(i), mySubType(i+1))) );

因此,每个元素的valstartstop如下:

start:0 stop:1
start:1 stop:2
start:2 stop:3
start:3 stop:4
start:4 stop:5
start:5 stop:6
start:6 stop:7
start:7 stop:8
start:8 stop:9
start:9 stop:10

start应始终与先前的stop相同(在此示例中就是这种情况)。为了检查这一点,我尝试了以下方法:

for (auto it = v.begin(); it != --v.end(); )
{
    if ((*it)->stop != (*(++it))->start)
        cout << "1";
}

令我惊讶的是,输出为:111111111,当它们都相等时,它们都不同。

我尝试了其他一些尝试来了解错误的来源。我用

替换了循环的内部
mySubType stop = (*it)->stop;
mySubType next_start = (*(++it))->start;
if (stop != next_start)
    cout << "2";

然后是>>

if ((*it)->stop.val != (*(++it))->start.val)
    cout << "3";

这些都没有打印任何东西(所有测试均被平等地解决了。

仅在使用unique_ptr时会发生这种情况(vector<myType>没有相同的问题)。我也尝试使用后增量,但得到的结果完全相同。

有人知道为什么会发生这种情况吗?

我知道有很多方法可以解决此问题(例如上面的2)。我感兴趣的是为什么

发生这种情况。

这是一个非常具体的问题,需要较长的解释时间,请耐心等待,我会尽力总结一下。我创建了2种用户类型,第一种在第二种内部使用:struct ...

c++ stl iterator smart-pointers unique-ptr
1个回答
1
投票

if语句中的表达式

© www.soinside.com 2019 - 2024. All rights reserved.