Семантическая проверка параметров шаблона по умолчанию - PullRequest
2 голосов
/ 16 января 2010

На странице 340 языка программирования C ++: Special Edition, Страуструп пишет ...

The semantic checking of a default argument for a template parameter is done if and (only) when that default argument is actually used. In particular, as long as we refrain from using the default template argument Cmp<T> we can compare() strings of a type for which Cmp<X> wouldn't compile (say, because < wasn't defined for an X). This point is crucial in the design of the standard containers, which rely on a template argument to specify default values.

У меня проблемы с намоткой головы на использование этого. Почему это правило позволяет сравнивать строки типа X, если обычно оно не компилируется? Разве это поведение не было бы нежелательным?

Ответы [ 2 ]

2 голосов
/ 16 января 2010

Данный пример:

template<class T, class C = Cmp<T> >
int compare(const String<T>& str1, const String<T>& str2) 
{
    // ... compare using C
}

Идея состоит в том, что шаблон класса Cmp может быть не определен или недопустим для некоторых T. В этом случае вы можете передать пользовательский шаблон класса сравнения:

compare<char, MyComparer>(str1, str2);

Если вы сделаете это, Cmp не будет использоваться и не будет проверяться, если он действительно скомпилируется.

0 голосов
/ 16 января 2010

Это говорит о том, что (например), если параметр имеет значение по умолчанию X, но вы указываете T, то семантика X не проверяется. Это важно, потому что X может не скомпилироваться (как говорится, потому что некоторый оператор не может быть определен на X).

, например

template <class T = int>
struct foo
{
  static int bar(T x) { return x.size(); }
}

int main()
{
  std::cout << foo<std::string>::bar("hello") << std::endl;
}

Это не вызывает ошибку, даже если .size () не определен для int. Это не вызывает ошибку, потому что параметр по умолчанию int фактически не используется.

Отвечая на ваш вопрос. Это не говорит о том, что это позволит сравнивать X, это говорит о том, что если вы используете T, то не имеет значения, можно ли сравнивать X, потому что вы не используете X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...