Вернуть значение без объявления типа возврата в шаблоне, это опечатка?

Я смотрю разговор Современное метапрограммирование шаблонов Вальтера Э. Брауна. В 54:40 код указан ниже

template<class t,="" t="" v="">
struct integral_constant{
 static constexpr T value = v;
 constexpr operator T() const noexcept { return value; } // what does this mean?
 constexpr T operator T() const noexcept { return value; }
};
</class>

Мой вопрос в том, что означает эта линия constexpr operator T() const noexcept { return value; }, почему нет типа возврата, но он все еще возвращает value? Это опечатка?

2 ответа

Да, вторая строка оператора неверна и может быть полностью удалена.

Оператор типа, например, например. Выполняется operator int() когда объект заливается или неявно преобразуется в тип:

MyClass myObject;
int i = myObject; // here operator int() is used.

Естественно, operator int() должен возвращать int. Для таких операторов не требуется или разрешено писать определенный тип возврата. В вашем случае это не int of float или что-то конкретное, но тип шаблона, но это та же идея.

Помимо проблемы с возвратным типом, вторая строка оператора снова определяет тот же самый оператор с одинаковыми параметрами, не может быть нескольких функций с одинаковыми именами и параметрами.

И после целого struct точки с запятой отсутствуют.

После устранения этих проблем он компилирует: http://ideone.com/Hvrex5


Первый - это не опечатка. Этот синтаксис используется для обеспечения преобразования из объекта класса в другой тип.

Возвращаемый тип T

Подробнее см. http://en.cppreference.com/w/cpp/language/cast_operator.

Квалификатор consexpr указывает компилятору, что возвращаемое значение функции-члена может быть определено во время компиляции, если объект, к которому он вызывается, также constexpr квалифицирован.

Второй не является юридическим выражением.

licensed under cc by-sa 3.0 with attribution.