Вывод типа вложенных функций D

Кто-нибудь знает, будет ли реализован subj? По крайней мере, класс автопамяти для них? Спасибо!


person Target-san    schedule 18.11.2010    source источник
comment
Пожалуйста, будьте более конкретными. Что вы имеете в виду под сабж?   -  person Jonathan M Davis    schedule 18.11.2010
comment
Я имею в виду, что констр. void foo() { auto bar() { return 3.14; }; } не будет компилироваться, так как bar не может иметь класс автоматического хранения. Мне просто было любопытно, планируется ли хотя бы такое улучшение.   -  person Target-san    schedule 18.11.2010


Ответы (1)


Существуют различные проблемы с автоматическими функциями в целом, поэтому вполне может быть, что вы не можете

void main()
{
    auto bar() { return "hello world"; }

    writeln(bar());
}

из-за ошибки с авто, а не так, как задумано. Я не уверен, каковы точные планы на этот счет, хотя я думаю, что вы должны иметь возможность использовать auto в качестве возвращаемого типа вложенной функции. В любом случае есть запрос на улучшение.

Однако независимо от того, работает ли auto с вложенными функциями, вы можете объявить делегат аналогичным образом:

void main()
{
    auto bar = () { return "hello world"; };

    writeln(bar());
}

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

person Jonathan M Davis    schedule 18.11.2010
comment
Если я правильно понимаю, делегат или ключевое слово функции не нужны? - person Target-san; 18.11.2010
comment
Возможно, было бы лучше иметь этот const bar = ..., чтобы он действовал больше как реальная функция WRT lvalues. - person BCS; 18.11.2010
comment
@Target-san Обычно вы используете ключевое слово функции или делегата только в том случае, если хотите, чтобы лямбда-функция была той или иной, и обычно в этом нет необходимости. - person Jonathan M Davis; 18.11.2010
comment
Кстати, если вы опустите ключевое слово, оно всегда будет делегатом, поэтому форсирование будет только одним способом. - person BCS; 18.11.2010
comment
Я не уверен, что спецификация требует, чтобы это всегда был делегат, если вы не помечаете его как функцию - теоретически компилятор должен быть в состоянии понять это для вас - но в настоящее время он всегда генерирует делегат из что я могу сказать. Хотя в какой-то момент это может измениться. Я не думаю, что это хорошая идея полагаться на то, что это делегат или указатель на функцию, если вы не укажете, что это такое. Однако в большинстве случаев я не думаю, что это имеет особое значение. Если вам действительно не все равно, вы всегда можете отметить это. - person Jonathan M Davis; 22.11.2010