Почему {} преобразован в 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
был выбран?
Ответы
Ответ 1
У нас есть три кандидата:
-
operator=(T const& )
-
operator=(std::vector<int> const& )
-
operator=(std::nullptr_t )
Как для # 1, так и для # 2, {}
приводит к пользовательской последовательности преобразований.
Однако, для # 3, {}
является стандартной последовательностью преобразования, потому что nullptr_t
не является типом класса.
Поскольку стандартная последовательность преобразования лучше, чем пользовательская последовательность преобразований, выигрывает # 3.