Неявное преобразование и функциональные операторы - PullRequest
0 голосов
/ 01 января 2019

Я изучаю функциональные операторы и не могу понять, почему фрагменты кода, такие как этот компилятор:

class Pocket
{
    int value;
public:
    Pocket(int value) :value(value) {}
    int getValue() const
    {
        return value;
    }
    operator int() const
    {
        return value;
    }
    bool operator<(const Pocket & _Right) const
    {
        return value < _Right.value;
    }
};

int main() {
    Pocket mynumbers1[] = { 3, 9, 2, -4, 4 };
    Pocket mynumbers2[] = { 3, 9, 5, 0, 4 };
    vector<Pocket> v1(mynumbers1, mynumbers1 + 5);
    vector<Pocket> v2(mynumbers2, mynumbers2 + 5);
    vector<Pocket> v3(5, 0);
    transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), minus<Pocket>());
    return 0;
}

Я считаю, что когда вы вызываете оператор minus<Pocket> внутри transform, все этоприведет к вычитанию между двумя Pocket с.Как видите, класс не определяет надлежащий operator-, только operator<, который в этом случае должен быть бесполезен, и преобразование в int, которое даже не следует рассматривать, поскольку оба аргументатого же типа.

Так чего мне не хватает?

1 Ответ

0 голосов
/ 02 января 2019

Определяемая пользователем функция преобразования, которая делает возможными следующие инициализации в вашем коде:

Pocket mynumbers1[] = { 3, 9, 2, -4, 4 };
Pocket mynumbers2[] = { 3, 9, 5, 0, 4 };

также будет использоваться компилятором при вызове transform при применении minus к заданномудиапазон:

transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), minus<Pocket>());

Если вы удалите функцию преобразования operator int() const, ни инициализация, ни преобразование не сработают.

Однако, если бы вы сделали функцию преобразования explicit, это будет работать для инициализации, но не для transform.См. Демо здесь .

Соответствующий раздел в стандарте для этого:

15.3.2 Функции преобразования [class.conv.fct]
...
2. Функция преобразования может быть явной, и в этом случае она рассматривается только как пользовательское преобразование для прямой инициализации.В противном случае пользовательские преобразования не ограничиваются использованием в присваиваниях и инициализациях.

...