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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Builder vs gcc 
:(
    Опции темы
borisbn
Дата 20.10.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Здравствуйте.
Несмотря на название, тему создал совершенно не для холивара, а чтобы разобраться, кто из них делает правильнее.
Итак, имеется код:
Код
template< class T >
void foo( T ) {
   cout << __PRETTY_FUNCTION__ << endl;
}

void foo( const std::string & ) {
   cout << __PRETTY_FUNCTION__ << endl;
}

int main()
{
   foo( 42 );
   foo( "qwe" );
   std::string x( "qwe" );
   foo( x );
}

http://liveworkspace.org/code/9f68394590f5...40a609b4cb6a373
LWS печатает
Цитата
void foo(T) [with T = int]
void foo(T) [with T = const char*]
void foo(const string&)

Builder же (под рукой только 5-й и BDSM) печатает для всех вызовов шаблонный вариант (ессно, я там заменил __PRETTY_FUNCTION__ на обычный вывод). Если же подправить вторую функцию так
Код
void foo( std::string ) {
   cout << __PRETTY_FUNCTION__ << endl;
}

то билдерюга при третьем вызове начинает выбирать её.
Вопрос: кто более прав - gcc или builder в изначальном варианте ?
Курение стандарта выело мозг напрочь. Эти 25 страниц раздела 13.3 Overloading ИМХО написаны инопланетянами smile 
Спасибо.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Dem_max
Дата 20.10.2012, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Ну на RAD 2010
такой код
Код

//---------------------------------------------------------------------------

#pragma hdrstop

#include <tchar.h>

#include <iostream>
#include <string>

using std::cout;
using std::endl;

template< class T >
void foo( T ) {
   cout << __func__ << endl;
}

void foo( const std::string & ) {
    cout << __func__ << endl;
}

/*void foo( std::string ) {
   cout << __PRETTY_FUNCTION__ << endl;
}*/
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
   foo( 42 );
   foo( "qwe" );
   std::string x( "qwe" );
    foo( x );
    return 0;
}
//---------------------------------------------------------------------------


выдает
foo<T>
foo<T>
foo


так что усе одинаково


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Randajad
Дата 20.10.2012, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем же известно, что билдер упорот.
На старых версиях даже буст не работал.
PM MAIL   Вверх
borisbn
Дата 20.10.2012, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Randajad, поверь, не от хорошей жизни  smile 

и всё-таки, как будет именно по стандарту, а не по реализации какого-либо компилятора ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 20.10.2012, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(borisbn @  20.10.2012,  12:16 Найти цитируемый пост)
Эти 25 страниц раздела 13.3 Overloading ИМХО написаны инопланетянами  

По моему далеко не только эти 25 страниц...  smile

borisbn, я не знаток (и не особый почитатель) стандарта, посему предлагаю свою дилетанскую версию.
Здесь много знатоков, (каждый день заходят новые), если что поправят.

В общем надо смотреть не "13.3 Overloading", а "14.8 Function template specializations"

Наиболее близко к теме, что удалось найти быстрым просмотром:
Цитата
14.8.2.1 Deducing template arguments from a function call
3. If P is a cv-qualified type, the top level cv-qualifiers of P's type are ignored for type deduction. If P is a
reference type, the type referred to by P is used for type deduction.

В общем, как я понял в этой функции
Цитата(borisbn @  20.10.2012,  12:16 Найти цитируемый пост)

void foo( const std::string & ) {
   cout << __PRETTY_FUNCTION__ << endl;
}

deduction должен проигнорировать const и &. и выдать полный "checking succeeds"
Ну а дальше, 
Цитата
14.8.3 Overload resolution
For each function template, if the argument deduction and checking succeeds, the template-
arguments (deduced and/or explicit) are used to synthesize the declaration of a single function template
specialization which is added to the candidate functions set to be used in overload resolution. 


Короче: д'Билдер не прав, а гсс прав!

Ну или как-то так. Почитайте 14 раздел, вы больше моего поймете. (с моим знанием инглиша, прости господи..  smile )

PM MAIL   Вверх
volatile
Дата 20.10.2012, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Упс, сорри. Все что выше к делу не относится.
Что-то мне показалось что у вас вторая функция тоже темплейтная.
Поэтому смотрел специализацию шаблонов.
Извиняюсь.
Не то.

Хотя чует мое сердце, что и при обыной перегрузке, cv-квалификаторы должны игнорироваться. (не только при специализации шаблонов.)
В принцип это где-то есть в стандарте.
Завтра еще посмотрю. 
borisbn, Сорри, еще раз.

PM MAIL   Вверх
NoviceF
Дата 20.10.2012, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: нет
Всего: 2



 smile 

по теме не в курсе, но болею за жисиси, быдлер не внушает доверия  smile 
PM MAIL   Вверх
Dem_max
Дата 21.10.2012, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



В топку 4,5,6,7 билдер, нашли чем проверять, они как состарились лет 10 назад и тогда не соответствовали стандарту.  А то что новая версия соответствует стандарту я вам доказательство привел.
Так что не стоит разводить холивар.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
borisbn
Дата 21.10.2012, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



> В топку 4,5,6,7 билдер, нашли чем проверять
К сожалению это не просто проверка, а упрощенный кусок кода из большого реального проекта, написанного на 5 д`билдере. Мне его приходится поддерживать. В новых проектах я вообще VCL не использую.

Я думаю, билдер “рассуждает“ след.образом:  полного соответствия во второй функции нет, поэтому можно попробовать шаблонную. А уж она “скушает“ всё и не подавится. А вот прав ли он по поводу полного соответствия — как раз и есть вопрос

Это сообщение отредактировал(а) borisbn - 21.10.2012, 07:55


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0900 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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