2013-07-12 4 views
17

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

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

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

Есть предложение было написано, или проблема была формально проанализирована в любом месте?

Умение обрабатывать тип класса как полное в пределах подписки участника может иметь другие последствия ... но это просто фураж для другого вопроса.

+0

Мне было интересно именно это. К сожалению, я тоже слишком ленив, чтобы следовать 1y предложениям ... – sehe

+0

@MarkGarcia Да, это данность. Я только добавил примечание к концу вопроса; члены, не являющиеся шаблонами, могут, возможно, открыть червоточину в сумеречной зоне. – Potatoswatter

+0

Если бы были какие-то примеры в вопросе, было бы легче понять для таких глупостей, как я. :) – iammilind

ответ

15

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

proposal-n3638 говорит,

SFINAE

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

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

+1

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

3

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

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

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

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

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

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

Смежные вопросы