почему идея о вложенных функциях не была реализована в более старом стандарте c ++? - PullRequest
4 голосов
/ 03 августа 2010

была идея вложенных функций, которые считались бесполезными во время разработки старого стандарта c ++, потому что его использование в основном охватывается другой концепцией, такой как объектно-ориентированное программирование; или это не было реализовано просто для упрощения?

Ответы [ 4 ]

4 голосов
/ 03 августа 2010

Вложенные функции - для удобства - в качестве контекста требуется кадр стека вмещающей функции.Посмотрите на это:

class Foo()
{
   void Tripulate()
   {
       int i=0; 

       void Dip()
       {
           // ...
       }

       int x = 12;
       for(i=1; i<=3; ++i)
       {
          int z= 33;
          Dip();
          // ...
       }
   }
}

К каким значениям должен получить доступ Dip ()?

Нет?Вы только что продублировали функциональность (анонимных) пространств имен, более или менее.
Только для i, потому что это единственный, определенный до функции?
Только для i и x, потому что они находятся в области видимости sam какDip()?Должен ли компилятор убедиться, что конструктор x уже запущен, или это ваша работа?
А как насчет z?

Если Дип получит доступ как к локальным значениям tripulate, так и к стековому фрейму, то внутренний прототип будет

   void Dip(Foo * this, __auto_struct_Dip * stackContext)
   {
       // ...
   }

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

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

2 голосов
/ 03 августа 2010

Идея поднималась (несколько раз) во время стандартизации.В 1996 году Стив Клэймдж написал сообщение в comp.std.c ++, отвечая на вопрос о добавлении их в C ++.Он суммировал свои пункты следующим образом:

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

Предложение добавить вложенные функции в C ++ должно показать важный класс задач программирования, решаемых с помощью вложенных функций, которые неудобно решать иначе.(Возможно, есть такие проблемы, и я просто не видел их.)

A (1998) post Эндрю Кенига косвенно заявляет, что комитет действительно обсуждал этоно, похоже, ничего из этого не материализовалось.

Очевидный способ поддержки вложенных функций требует аппаратной поддержки и все еще добавляет немного накладных расходов.Как отмечается в посте Фергуса Хендерсона, их также можно поддерживать с помощью кода «батута», но этот метод добавляет некоторую сложность компилятору (даже если они никогда не используются).* В качестве отступления: все трое являются членами комитета по стандартизации C ++ (или, по крайней мере, были в то время).Если память не изменяет, в то время Стив был либо организатором комитета ИСО, либо председателем комитета США.

1 голос
/ 03 августа 2010

Они вам на самом деле не нужны - вы можете просто использовать статические функции для достижения того же.Даже при программировании на языках, которые поддерживают вложенные функции, такие как Pascal, я избегаю их, потому что (по крайней мере мне) они делают код более сложным и менее читаемым.

0 голосов
/ 03 августа 2010

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

...