Сегодня я испытал интересное поведение с пользовательскими операторами неявного преобразования.Пользовательский оператор неявного преобразования и разрешение перегрузки
Давайте возьмем этот кусок кода:
struct Widget {
Widget(uint64_t) {
}
Widget(const std::string &) {
}
operator uint64_t() {
return static_cast<uint64_t>(123456789UL);
}
operator std::string() {
return std::string("Hello");
}
};
Базовая структура, которая неявно могут быть преобразованы либо в uint64_t или станд :: строки.
Теперь попробуйте распечатать Widget экземпляр через станд :: соиЬ:
#include <iostream>
int main() {
using std::cout;
Widget w(123456);
cout << w;
}
по какой-либо причине, виджет всегда будет преобразован в uint64_t. Сначала я ожидал бы призыв быть неоднозначным, и быть Qualifed со стандартным явным преобразованием для компиляции:
int main() {
using std::cout;
Widget w(123456);
cout << static_cast<uint64_t>(w);
}
Но по причине я не обращая внимания прямо сейчас, выбран оператор uint64_t. Я попытался посмотреть спецификацию на C++, но не смог найти ничего полезного, чтобы ответить на мой вопрос.
Может ли кто-нибудь помочь мне разобраться, что делает компилятор с разрешением перегрузки?
Спасибо, я не понял, что оператор << был перегружен как шаблон для std :: basic_string. Это все объясняет. Если я заменил std :: string на double, теперь он двусмыслен. – octal
@octal http: //en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt – stardust