Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Что означает “оператор auto?”

#cpp #операторы


template 
struct A {
    operator auto() {
        return T{};
    }
};


Что означает "оператор auto"? В чём его отличие от explicit operator auto()? Когда
они применяются?
    


Ответы

Ответ 1



// 1 struct widget { operator int() { return 10; } }; // 2 struct widget2 { operator auto() { return std::string{"hello"}; } }; // 3 struct widget3 { explicit operator int() { return 10; } }; // пример из вопроса template struct A { // метод для преобразования объектов типа A // в тип T (выведено) operator auto() { return T{}; } }; int main() { widget w; int wint = w; // ok widget2 w2; std::string wstr = w2; // ok widget3 w3; int w3int = w3; // error int w3inte = static_cast(w3); // ok A as; std::string asstr = as; // ok int asint = as; // error } Определенные пользователем преобразования. Есть возможность определить метод преобразования пользовательского типа в другой тип. Вывод типа с помощью auto. Как к любой другой функции, auto применим и к преобразователям. Explicit-спецификатор. (для функций преобразования) указывает копилятору, что функцию преобразования не нужно рассматривать при неявных приведениях типа. Начиная со стандарта C++14, ключевое слово auto можно использовать для типа возвращаемого значения функции, указывая, что тип возвращаемого значения должен быть выведен. Вместе с этим, auto может быть использован в операторах преобразования (также начиная с C++14). Существует одно исключение, auto нельзя использовать в шаблонных операторах преобразования. template operator auto() { return 1; } - не будет компилироваться. В примере из вопроса operator auto() { return T{}; }. Оператор преобразования не является шаблонным, требования к выведению типов соблюдены (все return-ы имеют одинаковый тип) - можно выводить тип. Тип будет выведен как T и данный оператор преобразования можно рассматривать как operator T{ return T{}; }

Комментариев нет:

Отправить комментарий