Рассмотрим следующий код:decltype (auto), возвращающий тип возврата и sfinae: можем ли мы их смешивать?
auto f() -> decltype(auto) { /* do whatever you want here */ }
int main() { f(); }
Возвращаемый тип выводится и decltype(auto)
используется как отстающие тип возвращаемого значения.
Код ниже немного изменен (на самом деле, sfinae'd) версия:
struct S { static void f() {} };
struct T {};
template<typename U>
auto f(int) -> decltype(U::f(), void()) {
// do whatever you want here
}
template<typename>
auto f(char) -> decltype(auto) {
// do whatever you want here
}
int main() {
f<S>(0);
f<T>(0);
}
Если взять экзамен эту функцию:
template<typename U>
auto f(int) -> decltype(U::f(), void()) {
// do whatever you want here
}
Возникает вопрос: можно ли используйте возвращаемый тип возврата, чтобы сделать sfinae и все еще иметь тип возвращаемого вывода?
Я имею в виду что-то вроде кода ниже (который не работает, конечно):
template<typename U>
auto f(int) -> decltype(U::f(), auto) {
// do whatever you want here
}
Примечания: Я не ищу альтернативные подходы, включающие параметры шаблона, я знаю их, и я» m просто интересно узнать, является ли жизнеспособным решением.
Не думайте, что это возможно, но вы хотите, чтобы тип был выведен как 'auto' или как' decltype (auto) '? – Holt
Не думайте, что вы можете здесь что-то сделать. Выведенные типы возврата намеренно не являются SFINAE. – Xeo
@Holt Хороший вопрос, я бы сказал 'decltype (auto)' как в первом примере, но если вы знаете, как его вывести как 'auto', это может быть хорошим ответом. – skypjack