Подтвердить что ты не робот

Могу ли я написать тип функции, который возвращает функцию?

Ниже не удается скомпилировать как gcc, так и clang

#include <type_traits>

int foo();

int main()
{
    using R = std::result_of_t<decltype(foo)()>; // error
}

Ошибка обоих компиляторов связана с незаконностью объявления функции, возвращающей функцию. Но я не объявляю такую ​​функцию - я просто пытаюсь написать ее тип - так как это ожидает result_of. Неужели это еще плохо сформировано?

4b9b3361

Ответ 1

Вы передаете идентификатор типа, который определен в [dcl.name] как

[...] синтаксически объявление для переменной или функции этого типа, которая опускает имя объекта. [...] Можно однозначно идентифицировать местоположение в абстрактном-деклараторе, где идентификатор будет выглядеть , если конструкция была декларатором в объявлении. Именованный тип тогда совпадает с типом гипотетический идентификатор.

Для гипотетического идентификатора, который должен иметь некоторый тип, гипотетическое объявление должно быть хорошо сформировано в первую очередь. Но это не соответствует [dcl.fct]/10. Следовательно, программа плохо сформирована (и сообщения об ошибках компиляторов на самом деле понятны). Этот случай также более непосредственно покрывается [temp.deduct]/(8.10), подразумевая, что это (SFINAE-дружественная) ошибка.


Фактически, просто подразумевается использование недопустимого типа, чтобы сделать программу плохо сформированной. Например. создание указателя типа функции возврата функции плохо сформировано:

using f = int();
using t = f(*)();

Итак, следующее:

struct A {virtual void f() = 0;};
using t = A(*)();

(Clang не должен принимать это. C.f. Ошибка GCC 17232 интересное обсуждение).