Здравствуйте, waev, Вы писали:
W>Здравствуйте, Кодт, Вы писали:
К>>Почему это не поддержано в стандарте?
К>>Во-первых, потому же, почему голый сишный указатель на функцию нельзя получить из std::function (наоборот — можно). Здесь не только семейство сигнатур описывается (void(int), void(int,int)), но и выражения для вычисления аргументов. А это уже в один указатель не вместится. Либо это будет указатель не на функцию, а на таблицу функций, или на какой-нибудь хитрый диспетчерский код. И никакой совместимости со старым добрым Си.
К>>Во-вторых, поддержка этой фичи — это синтаксический сахар, сравнимый по объёму с лямбдами. Сколько лет потребовалось, чтобы лямбды в стандарт вошли? Сколько потребуется, чтобы ввести полиморфные лямбды? Вот то-то же. Если очень хочется, — нужно писать заявку в комитет и в ньюсгруппу.
W>ну вот я тоже к такому же мнению склоняюсь, что такую штуку можно самостоятельно на шаблонах и bind-ах реализовать, и поэтому дядьки из комитета не стали её вводить, что бы не усложнять язык.
W>(я просто думал, что, ну, может там может возникает какое-нибудь противоречие или неоднозначность в коде, которое мне не очевидно).
Ну вот насчет "вводить", если верить вот этому
http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/Deprecated-Features.html#Deprecated-Features (The use of default arguments in function pointers, function typedefs and other places where they are not permitted by the standard is deprecated and will be removed from a future version of G++.), то в гцц это было уже достаточно давно. Ну и как мне кажется, когда поддерживаются дефолтные параметры для функций, то поддержка дефолтных параметров для указателей получается сама собой. Её наоборот специально выкорчевывать надо. Естественно, речь не идет про включение параметра в тип. Только о использовании параметра в момент вызова. Компилятор же видит объявление указателя в момент вызова, и из объявления берет дефолтные значения.
А вот причины, почему эту фичу из стандарта исключили мне не до конца понятны. Ну то есть да, единственный вариант -- это неоднозначность, которая возникает при присвоении указателей на функции с разными дефолтными параметрами.
А неоднозначность, которую можно получить если указать разные дефолтные параметры при объявлении одной и той же функции в разных единицах трансляции, просто так не исключишь. Ну то есть, если я правильно понимаю, если объявления в разных единицах трансляции, то компилятор про них никак не узнает, поэтому починить это поведение не удастся. Поэтому починили то, что смогли.
Но да, какая-то слабая версия на самом деле получается. Должен быть какой-то серьезный подводный камень при использовании дефолтных параметров у указателей.