默认模板参数的语义检查

时间:2010-01-16 05:49:40

标签: c++ templates

在C ++编程语言:特别版的第340页,Stroustrup写道......

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 个答案:

答案 0 :(得分:2)

给出的例子是:

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就不会被使用,如果它真的要编译就不会被检查。

答案 1 :(得分:0)

它说(例如)如果参数默认为X,但是指定T,则不检查X的语义。这很重要,因为X可能无法编译(因为它说,因为某些运算符可能未在X上定义)。

e.g。

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;
}

即使没有为int定义.size(),也不会导致错误。它不会导致错误,因为实际上并未使用int的默认参数。

回答你的问题。它并不是说它会允许对X进行比较,而是说如果你使用T,那么如果可以比较X是无关紧要的,因为你没有使用X.