Почему шаблонный аргумент по умолчанию для функции mem должен быть явно определен как недопустимый? - PullRequest
5 голосов
/ 06 декабря 2010

В N3126 ( Предупреждение: очень большой PDF ) 14.1 / 9, есть два утверждения, которые меня смущают:

#1: "В объявлении шаблона может быть указан аргумент шаблона по умолчанию."

#2: "Параметр шаблона по умолчанию не должен указываться в списках параметров шаблона определения члена шаблона класса, который появляется вне класса члена."

#1 означает, что следующий код является допустимым:

template <class T = int>
void f(T = T())
{}

int main()
{
    int n = f(); // equivalent to f<int>() or f(0);
    return 0;
}

#2 означает, что следующий код недопустим:

template <class T>
struct X
{
    template <class U = T>
    void f(U a = U())
    {}
};

int main()
{
    X<int> x;
    x.f(); // illegal, though I think it should be equivalent to x.f<int>() or x.f(0)
    return 0;
}

Мне просто интересно, почему последний должен быть явно определен как незаконный по стандарту?

Что является обоснованием?

1 Ответ

4 голосов
/ 06 декабря 2010

Я могу ошибаться, но мое понимание #2 состоит в том, что это делает следующее незаконным:

template<class T>
struct A
{
    void foo();
};

template<class T = int>
void A<T>::foo() { /* ... */ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...