Параметр по умолчанию против дедуцированного шаблона?

В следующих :

template<typename Type>
struct MyClass
{
template<typename OtherType> MyClass(const MyClass<OtherType>& x);
template<typename OtherType = Type> void test(const MyClass<OtherType>& x);
};

В функции test что сделано между:

Случай 1 : Параметр по умолчанию является приоритетным: конструктор преобразования MyClass<Type>(const MyClass<OtherType>& x) косвенно называется и MyClass<Type>::test<Type>(const MyClass<Type>& x) называется.

Случай 2: Выведенный параметр является приоритетным: MyClass<Type>::test<Type>(const MyClass<OtherType>& x) называется.


Я думаю, что хороший ответ — второй, но я не уверен. Можете ли вы подтвердить мне это (и что эта ситуация четко определена стандартом)?


РЕДАКТИРОВАТЬ: тестовая функция вызывается:

MyClass<double> d;
MyClass<unsigned int> ui;
d.test(ui); // <- So the question is : is ui implicitely
//    converted to MyClass<double> or not ?

1

Решение

test будет называться

MyClass<double>::test(const MyClass<unsigned int> &)

т.е. не будет никакого преобразования ui от MyClass<unsigned int> в MyClass<double>,

Аргумент шаблона по умолчанию никогда не переопределяет данный. Он используется только тогда, когда не задан аргумент шаблона, и компилятор не может вывести его из аргументов функции.

Из стандарта C ++ 11:

(§14.8.2 / 5) Результирующий замещенный и скорректированный тип функции используется в качестве типа шаблона функции для вывода аргумента шаблона. Если аргумент шаблона не был выведен, используется его аргумент шаблона по умолчанию, если он есть. [ Пример:

template <class T, class U = double>
void f(T t = 0, U u = 0);
void g() {
f(1, ’c’);      // f<int,char>(1,’c’)
f(1);           // f<int,double>(1,0)
f();            // error: T cannot be deduced
f<int>();       // f<int,double>(0,0)
f<int,char>();  // f<int,char>(0,0)
}

— конец примера]

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]