SFINAE и decltype(авто)

Если шаблон функции возвращает decltype(auto) (или другой спецификатор типа, использующий auto), но оператор return будет некорректным, получится ли результат SFINAE? Считается ли оператор return непосредственным контекстом сигнатуры функции?

Ничто в черновике N3690, кажется, не требует этого. По умолчанию, я думаю, SFINAE не применяется.

Это кажется неудачным, потому что вы можете написать функцию для пересылки в другую функцию, но вы не можете сделать ее существование зависимым от делегата, как при написании от руки. Кроме того, проверка существования одноранговой нестатической функции-члена не может быть выполнена без decltype(auto), поскольку this нельзя использовать в сигнатуре функции. Однако это указывает на фундаментальную проблему, поскольку decltype(auto) обеспечивает путь к рассмотрению типа класса как завершенного в подписи члена, где это не так.

Было ли написано предложение или где-то формально анализировалась проблема?

Возможность рассматривать тип класса как завершенный в сигнатуре члена может иметь и другие последствия… но это просто повод для другого вопроса.


person Potatoswatter    schedule 12.07.2013    source источник
comment
Я интересовался именно этим. К сожалению, я также был слишком ленив, чтобы следить за предложениями 1y ...   -  person sehe    schedule 12.07.2013
comment
@MarkGarcia Да, это само собой разумеющееся. Я только что добавил примечание в конец вопроса; члены, не являющиеся шаблонными, все еще могут открыть червоточину в сумеречную зону.   -  person Potatoswatter    schedule 12.07.2013
comment
Если бы в вопросе были какие-то примеры, таким тупицам, как я, было бы легче понять. :)   -  person iammilind    schedule 12.07.2013
comment
Небольшой пример поможет сделать вопрос более ясным. Возможно, есть и другие способы добиться желаемого.   -  person n. 1.8e9-where's-my-share m.    schedule 12.07.2013
comment
@н.м. Всегда есть больше способов. Я не застрял, но я пытаюсь избежать 8 повторяющихся перегрузок. Ответ, который я ищу, - это указатель на документ с предложением, чтобы я мог решить, писать ли отчет самому.   -  person Potatoswatter    schedule 12.07.2013


Ответы (2)


но оператор return будет неправильно сформирован, получается ли SFINAE?

В proposal-n3638 говорится:

СФИНАЭ

Поскольку тип возвращаемого значения выводится путем создания экземпляра шаблона, если создание экземпляра неправильно сформировано, это вызывает ошибку, а не сбой подстановки. Это позволяет функции auto возвращать лямбду, что невозможно при использовании шаблона decltype (возвращаемое выражение).

Надеюсь, это то, что вы ищете.

person Nawaz    schedule 12.07.2013
comment
Бинго! Именно то, что я искал. Мне нужно идти сейчас, но я прочитаю это позже, чтобы выяснить, как они согласовывают создание экземпляров членов с неполным типом. - person Potatoswatter; 12.07.2013

Следуя ссылке Наваза, на оставшиеся вопросы отвечает N3690 §7.1.6.4/11:

Если для определения типа выражения необходим тип объекта с невыведенным типом-заполнителем, программа имеет неправильный формат.

Это означает, что даже если бы SFINAE работал с выводом типа возвращаемого значения, его нельзя было бы использовать для запроса одного объявления функции из другого. Подпись по существу недействительна до тех пор, пока не будет обработан оператор return, что происходит в закрывающей фигурной скобке определения class {}, и после обработки определений предыдущих элементов.

В некотором смысле все функции-члены decltype(auto) являются неполными по отношению к предыдущим функциям того же класса:

struct s {
    void f() { a(); } // error: use of ‘auto s::a()’ before deduction of ‘auto’
    auto a() { return 3; }
};

Это жалоба GCC; он исчезает, если объявления членов меняются местами. Это связано с тем, что определения функций обрабатываются в порядке объявления, когда достигается } из определения класса. Если оператор a(); обрабатывается до return 3;, то программа некорректна.

person Potatoswatter    schedule 12.07.2013