неопределенная привязка

#c #bind #msdn #unspecified

#c #привязка #msdn #неуказанный

Вопрос:

Я исследовал, что std::bind такое и для чего это нужно (это может в конечном итоге быть другим вопросом) в MSDN: http://msdn.microsoft.com/en-us/library/bb982702.aspx

И увидел, что перечисленные прототипы:

 template<class Fty, class T1, class T2, ..., class TN>
   unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);
template<class Ret, class Fty, class T1, class T2, ..., class TN>
   unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);
 

Что меня смущает по двум причинам. 1) В последний раз, когда я проверял, MSVC не реализовывал переменные шаблоны, и 2) Мой вопрос: что означает это слово unspecified там? (Похоже, это не связано с неопределенным поведением.)

Ответ №1:

Неуказанный в возвращаемом типе означает, что это тип, который, ну, не указан. Стандарт не требует возврата определенного типа bind , если возвращаемый тип соответствует требованиям, установленным стандартом.

На ... данный момент я не знаю, реализует ли VS их или нет, но вы увидите ту же документацию для boost::bind , и она уже некоторое время компилируется в разных компиляторах без поддержки переменных шаблонов… в документации указано, что вы можете передавать N аргументы разных типов, но это не обязательно означает, что существует единый шаблон, который это делает, он может быть реализован в терминах набора 1-арных, 2-арных… N-арных шаблонов.

Документация показывает поведение, которое вы можете ожидать от его использования, а не детали того, как оно реализовано.

Комментарии:

1. О, я упустил из виду отсутствие возвращаемого типа. Вот и все.

Ответ №2:

Существуют отдельные перегрузки, которые ожидают аргументы {1, 2, …, N} . Вместо того, чтобы перечислять их все, в документации используется сокращение, чтобы показать, что вы можете использовать различное количество параметров. Это не предназначено для иллюстрации допустимого синтаксиса C . Я бы ожидал, что в документации где-нибудь будет указано, что такое N.

Тип результата зависит от переданных аргументов. Это будет некоторая форма функтора, и этот функтор, как правило, будет храниться в function объекте, или вы можете передать результат непосредственно чему-то вроде for_each и позволить вычитанию типа шаблона компилятора выяснить это. Пока результат можно вызвать, фактический тип не имеет значения, и было бы сложно попытаться кратко объяснить в документации.

Ответ №3:

Visual Studio не реализует переменные шаблоны. Они эмулируют концепцию, по сути, имея много перегрузок функции (вероятно, созданных с помощью макросов). Вот как boost::bind это реализовано, откуда std::bind и берется.

unspecified Возвращаемый тип std::bind является именно таким. Требуется, чтобы это был объект подвижного типа. Этот объект будет перегружен operator() , так что std::bind может быть вызвана функция, связанная с помощью.