Здравствуйте, Павел Кузнецов, Вы писали:
Че-то у меня крыша едет.
Пример.
/* main.cpp */
#include <iostream>
using namespace std;
/* main() */
template <class T>
void test(const T &) { cout << "1\n" ; }
void test(const char *) { cout << "2\n" ; }
int main()
{
test("x");
char *c=0;
test(c);
return 0;
}
VC++ 7.1 /Za печатает 2 1
Intel C++ 8.0 печатает 1 1
Кто больше?
... << RSDN@Home 1.1.0 stable >>
> > template <class T>
> void test(const T &) { cout << "1\n" ; }
>
> void test(const char *) { cout << "2\n" ; }
>
> int main()
> {
> test("x");
> char *c=0;
> test(c);
> return 0;
> }
>
>
> VC++ 7.1 /Za печатает 2 1
> Intel C++ 8.0 печатает 1 1
У Интела ошибка, присутствовавшая в старой версии Comeau; она меня
раньшеАвтор: Павел Кузнецов
Дата: 08.12.03
тоже смутила. В Comeau 4.3.3, использующем более новый EDG-front end, результат совпадает с VC++7.1. Правильным ответом является "2 1".
Почему при вызове test("x") должна быть вызвана вторая функция. После вывода аргумента шаблона компилятор стоит перед выбором из двух сигнатур:
typedef const char T [2];
void test(const T&);
void test(const char *);
Т.к. cv-квалификаторы, примененные к массивам, переносятся на их элементы (8.3.4/1), это эквивалентно:
void test(const char (&) [2]);
void test(const char *);
Что дает неоднозначность, как я уже описал
вышеАвтор: Павел Кузнецов
Дата: 30.05.04
. Однако т.к. первая функция является специализацией шаблона, то "выигрывает" вторая.
Почему при вызове test(c) должна быть вызвана первая функция. После вывода аргументов шаблона компилятор имеет дело с двумя сигнатурами:
typedef char* T;
void test(const T&);
void test(const char*);
Соответственно:
void test(char* const&);
void test(const char*);
Здесь уже ситуация отличается: преобразование char* -> const char* является Qualification conversion и, хотя имеет тот же ранг Exact Match, что и array-to-pointer conversion, относится к категории Qualification Adjustment, а не Lvalue Transformation. Это означает, что исключение относительно Lvalue Transformations из 13.3.3.2/3 на него не действует, и, соответственно, первая сигнатура "побеждает".
Posted via RSDN NNTP Server 1.9 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
> ПК>> ПК>void test(char const *&);
> ПК>void test(const char (&)[2]);
> ПК>
>
> А вот здесь нет ambiguty.
Да, конечно — ссылка в первом случае должна быть тоже константной, т.к. результат преобразования — rvalue.
Posted via RSDN NNTP Server 1.9 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен