Шаблоны C ++, vector.size, используемый в определении параметров по умолчанию - PullRequest
3 голосов
/ 10 февраля 2012

Есть структура ТА

template <typename T>
struct TA
{
    typedef std::vector <T> Type;
};

и функция test (), имеющая параметр по умолчанию типа TA.

template <typename T>
void test ( typename TA<T>::Type a1, 
            typename TA<T>::Type a2 = typename TA<T>::Type(a1.size()) )
{}

Возможно ли использовать a1.size () в определении параметра a2 по умолчанию?

int main()
{
    TA <double> ::Type a1;
    test<double>(a1);
}

Ответы [ 2 ]

7 голосов
/ 10 февраля 2012

Возможно ли использовать a1.size () в определении параметра по умолчанию a2?

Нет.Это запрещено Стандартом.Вы не можете использовать параметр функции, чтобы установить значение по умолчанию для другого параметра.

§8.3.6 / 9 (C ++ 03) прямо говорит,

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

Таким образом, решение заключается в следующем: используйте перегрузку:

template <typename T>
void test(typename TAs<T>::Type a)
{
    test(a, typename TA<T>::Type(a.size()));
}
5 голосов
/ 10 февраля 2012

Нет.В общем случае аргумент функции нельзя использовать вне тела функции, и, в частности, его нельзя использовать в значении по умолчанию для другого параметра.

Такой же эффект можно получить, перегрузив:

template <typename T>
void test ( typename TAs<T>::Type a1, typename TA<T>::Type a2);

template <typename T>
void test ( typename TAs<T>::Type a1)
{
    test(a1, typename TA<T>::Type(a1.size()));
}
...