Различные результаты при использовании auto в качестве аргумента функции-члена - PullRequest
0 голосов
/ 16 ноября 2018

Я получаю разные результаты при запуске этих двух

Я на GNU/Linux 4.14.67

Оба они запускаются с использованием g++ -std=c++14 с / без -O0, а также с c++17.

Почему я? Почему выходы разные?

Первая версия:

#include <iostream>
#include <algorithm>
using namespace std;

class foo {
public:
    foo() { }
    foo(const foo& f) { }
    foo& operator=(const foo& f) {
        cout << "foo operator=\n";
        val = 888;
        // Do something important
        return *this;
    }
    int val;
};

int main() {
    foo f1;
    foo f2;
    f1 = f2;

    cout << f1.val << endl;
}

Первый вывод:

foo operator=
888

Вторая версия (только изменение const foo& на const auto&):

#include <iostream>
#include <algorithm>
using namespace std;

class foo {
public:
    foo() { }
    foo(const foo& f) { }
    foo& operator=(const auto& f) {
        cout << "foo operator=\n";
        val = 888;
        // Do something important
        return *this;
    }
    int val;
};

int main() {
    foo f1;
    foo f2;
    f1 = f2;

    cout << f1.val << endl;
}

Второй вывод:

0

1 Ответ

0 голосов
/ 16 ноября 2018

Это:

foo& operator=(const auto& f);

не будет стандартным кодом C ++ до C ++ 20. Но gcc разрешил это в течение достаточно долгого времени, и это означает:

template <typename _T>
foo& operator=(const _T& f);

Другими словами, это шаблон оператора присваивания. Это , а не оператор копирования. Это должно быть не шаблон. Поскольку вы не предоставили оператор присваивания копии, компилятор с радостью сгенерирует его для вас. В первом примере кода вы указали свой собственный оператор назначения копирования.

Когда вы пишете:

f1 = f2;

В вашем первом примере у этого выражения есть один кандидат: оператор присвоения копии, который вы написали. Во втором примере есть два кандидата: ваш шаблон оператора присваивания и оператор присваивания копии, синтезированный компилятором. Компилятор лучше подходит (не шаблонный шаблон), поэтому он вызывается, а не ваш.

...