2010-09-07 6 views

ответ

4

Если вы не используете аргумент по умолчанию (то есть, вы указываете значение), то он не создается вообще.

14.7.1/2:

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

Какой глоток. Фактически, аргументы по умолчанию для обеих функций и шаблонов имеют для них конкретные правила создания экземпляров.

+1

вопрос: 'A (C c = C())' где 'C :: C()' не имеет значения по умолчанию – Anycorn

+0

@aaa: О, извините. Если вы не используете аргумент по умолчанию, он не оценивается. – Potatoswatter

3

Я не уверен, в чем заключается ваша дилемма. Если вам интересно, как шаблон может быть создан при отсутствии конструктора по умолчанию, это нормально. По умолчанию первый аргумент конструктора шаблона требуется только в том случае, если аргумент не указан. Компилятор доволен C, у которого нет конструктора по умолчанию, так как ему не нужно его использовать.

С другой стороны, если вы пробовали

A<C> a; 

Компилятор должен соответствовать вызов конструктора к A<C>::A(C) с аргументом по умолчанию C(), и это вызовет компиляции ошибки времени как тип C не делает имеет конструктор по умолчанию.

Фактическая цитата из стандарта из §14.7.1 [temp.inst]/11:

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

Настоящий пример приведен в следующем параграфе §14.7.1 [temp.inst]/12:

Каждый аргумент по умолчанию создается независимо. [Пример:

template<class T> 
void f(T x, T y = ydef(T()), T z = zdef(T())); 
class A { }; 
A zdef(A); 
void g(A a, A b, A c) { 
    f(a, b, c);   // no default argument instantiation 
    f(a, b);   // default argument z = zdef(T()) instantiated 
    f(a);    // ill-formed; ydef is not declared 
} 

-end пример]

3

Если аргумент по умолчанию никогда не используется, то это нормально, так как его никогда не оценивали компилятором, пока он не используется. Однако, как только вы используете аргумент по умолчанию, такой как:

A<C> a; 

вы должны получить компиляцию.

Смежные вопросы