В чем разница между сохранением равенства и стабильностью? - PullRequest
2 голосов
/ 26 сентября 2019

Согласно проекту :

Выражение , сохраняющее равенство , если при равных входных данных выражение приводит к равным выходным данным. [...]

и

[...] stable : для двух вычислений такого выражения с одинаковыми входными объектами необходимо иметьв равных выходных данных отсутствуют какие-либо явные промежуточные изменения этих входных объектов. [...]

выделение мое.

  • В чем разница между ними?

  • Когда выражение может быть сохраняющим равенство , но не стабильным и и наоборот ?

1 Ответ

3 голосов
/ 26 сентября 2019

Эти два будут отличаться для операции, которая изменила свои входные данные.

// stable and equality preserving
int foo(int a, int b) { 
    return a + b;
}

// equality preserving, but not stable:
int bar(int a, int &b) { 
    auto ret = a + b;
    ++b;
    return ret;
}

Например:

int x = 1, y = 2;
int z = foo(x, y); // produces 3

int z2 = f(x, y);  // still produces 3

int zz = bar(x, y); // produces 3
int zz2 = bar(x, y); // produces 4

Что касается чего-то, что было стабильным, но не сохраняющим равенство, да,это также возможно (для некоторых определений «равно»).

Для тривиального примера рассмотрим что-то вроде этого:

struct foo { 
    int bar;

    // they're all equal, just some are more equal than others
    bool operator==(foo const &) const { return true; }
};

int operator+(foo a, foo b) { return a.bar + b.bar; }

foo a{1};
foo b{2};
foo c{3};

// obviously both true
assert(a == b);
assert(b == c);

int x = a + b;
int y = b + c;

assert(x != y); // of course 1 + 2 != 2 + 3;
...