对隐式模板实例化感到困惑

时间:2010-10-07 10:21:03

标签: c++ templates

这是来自C ++ 03标准的声明,§14.7.1p5:

  

如果重载解析过程可以确定正确的功能         如果没有实例化类模板定义就调用它          未指定实例化是否实际发生。 [示例:

template <class T> struct S {
       operator int();
};

void f(int);
void f(S<int>&);
void f(S<float>);

void g(S<int>& sr) {
        f(sr);     // instantiation of S<int> allowed but not required
                   // instantiation of S<float> allowed but not required
};
     

- 结束示例]

我无法理解这一点。它有不确定的行为吗?

我发现了另一个similar problem,我也不明白。在那里解释说正确的行为是不确定的,但这是什么意思?

这里: MSVC: Implicit Template Instantiation, though templated constructor not used

2 个答案:

答案 0 :(得分:3)

未指定表示

  1. 由编译器决定是否实际实例化模板化的类和
  2. 编译器设计者必须选择一些策略来处理这种情况和
  3. 编译器设计者无需记录他们的选择。
  4. 无论如何,这是正确的行为,不像未定义的行为这是错误的行为。有关详细说明,请参阅this related question

答案 1 :(得分:0)

在重载解析期间,确定在编写f(sr)时调用的正确函数是void f(S<int>&);而未显式实例化类模板S的定义,未指定您的类是否为实际上是实例化的。

未定义的行为和未指定的行为是两件完全不同的事情。

  

实例化S&lt; int&gt;允许但不是必需的

例如:

template <class T =int> 
struct S 
{
  operator int();
};

是允许但不是必需的。