Подтвердить что ты не робот

Почему {} преобразован в std:: nullptr_t в первом порядке?

Этот код:

#include <iostream>
#include <vector>

using namespace std;

void dump(const std::string& s) {
    cout << s << endl;
}

class T {
public:
    T() {
        dump("default ctor");
    }

    T(std::nullptr_t) {
        dump("ctor from nullptr_t");
    }

    T(const T&) {
        dump("copy ctor");
    }

    T& operator=(const T&) {
        dump("copy operator=");
        return *this;
    }

    T& operator=(std::nullptr_t) {
        dump("operator=(std::nullptr_t)");
        return *this;
    }

    T& operator=(const std::vector<int>&) {
        dump("operator=(vector)");
        return *this;
    }
};

int main() {
    T t0;

    t0 = {};

    return 0;
}

выходы:

default ctor
operator=(std::nullptr_t)

почему operator= с std::nullptr_t был выбран?

4b9b3361

Ответ 1

У нас есть три кандидата:

  • operator=(T const& )
  • operator=(std::vector<int> const& )
  • operator=(std::nullptr_t )

Как для # 1, так и для # 2, {} приводит к пользовательской последовательности преобразований.

Однако, для # 3, {} является стандартной последовательностью преобразования, потому что nullptr_t не является типом класса.

Поскольку стандартная последовательность преобразования лучше, чем пользовательская последовательность преобразований, выигрывает # 3.