Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SFINAE 
:(
    Опции темы
UnrealMan
Дата 1.12.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Есть ли в стандарте информация насчёт SFINAE или же это просто особенность отдельно взятых компиляторов? Интересует, собственно, перечень конструкций, неудачное образование которых не приводит к ошибкам. Например, конструкция

Код
ClassTemplateName<sizeof T(1, 1)>

может не быть корректно построенным типом из-за того, что у T нет подходящего конструктора, однако принцип SFINAE тут не работает (по крайней мере, у меня компилятор (MinGW-3.4.4) ругается, если не существует подходящего конструктора).
PM MAIL   Вверх
JackYF
Дата 1.12.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(UnrealMan @  1.12.2006,  11:17 Найти цитируемый пост)
ClassTemplateName<sizeof T(1, 1)>

А что, у нас в зависимости от выполненного конструктора меняется размер типа?  smile 
sizeof(T) сложно написать???

Зачем так извращаться?  smile 



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 1.12.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  1.12.2006,  16:18 Найти цитируемый пост)
Зачем так извращаться?  

Если бы здесь работал принцип SFINAE, то можно было бы узнать, есть подходящий контруктор у класса или нет, причём вместо ошибки компиляции (когда подходящего конструктора нет) избирать другой способ поведения программы. Да и вообще, если бы любую подобную ошибку использования типа можно было б обернуть в sizeof и на это дело распространялся принцип SFINAE, этому принципу цены б тогда не было  smile

Напомню, что принцип SFINAE (substitution failure is not an error) заключается в том, что если при инстанцировании шаблона функции составление какого-либо типа её сигнатуры терпит неудачу, то такая функция исключается из списка кандидатов по части наилучшего соотвествия среди перегруженных функций, вместо того чтобы вызывать ошибку компиляции (увы, более точного определения дать не могу, поэтому и спрашиваю о наличии подробного описания в стандарте). Например, здесь

Код
void Func(...);
template <class T>
    typename T::Type Func(const T &);
void f() { Func(1); } // выбирается void Func(...) 

у типа T может не быть типа-члена Type. В таком случае вторая функция будет исключена из перечня рассматриваемых при выборе наилучшего соотвествия в перегрузке.
PM MAIL   Вверх
Daevaorn
Дата 1.12.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



PM MAIL WWW   Вверх
UnrealMan
Дата 1.12.2006, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Это я уже читал – там представлена довольно скудная информация. Хоть там и есть ссылка на стандарт, но стандарт-то старый (1998 года), у меня же в наличии только 2003 года. Никаких интересующих меня подробностей в этом пункте 14.8.3 я у себя не нашёл...
PM MAIL   Вверх
JackYF
Дата 1.12.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Daevaorn @  1.12.2006,  19:23 Найти цитируемый пост)
http://en.wikipedia.org/wiki/SFINAE 


Это было мне? Так я уже это просмотрел...



Все... я понял. Не разобрался сначала.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 1.12.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



О! Кажется, я нашёл то, что искал: похоже, все случаи изложены в 14.8.2 smile

Цитата
Type deduction may fail for the following reasons:

— Attempting to create an array with an element type that is void, a function type, or a reference type, or attempting to create an array with a size that is zero or negative. [Example:

Код
template <class T> int f(T[5]);
int I = f<int>(0);
int j = f<void>(0); // invalid array

]
— Attempting to use a type that is not a class type in a qualified name. [Example:

Код
template <class T> int f(typename T::B*);
int i = f<int>(0);

]
— Attempting to use a type in the qualifier portion of a qualified name that names a type when that type does not contain the specified member, or if the specified member is not a type where a type is required. [Example:

Код
template <class T> int f(typename T::B*);
struct A {};
struct C { int B; };
int i = f<A>(0);
int j = f<C>(0);

]
— Attempting to create a pointer to reference type.
— Attempting to create a reference to a reference type or a reference to void.
— Attempting to create "pointer to member of T" when T is not a class type. [Example:

Код
template <class T> int f(int T::*);
int i = f<int>(0);

]
— Attempting to perform an invalid conversion in either a template argument expression, or an expression used in the function declaration. [Example:

Код
template <class T, T*> int f(int);
int i2 = f<int,1>(0); // can’t conv 1 to int*

]
— Attempting to create a function type in which a parameter has a type of void.
— Attempting to create a cv-qualified function type.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.