这是来自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
答案 0 :(得分:3)
未指定表示
无论如何,这是正确的行为,不像未定义的行为这是错误的行为。有关详细说明,请参阅this related question。
答案 1 :(得分:0)
在重载解析期间,确定在编写f(sr)
时调用的正确函数是void f(S<int>&);
而未显式实例化类模板S
的定义,未指定您的类是否为实际上是实例化的。
未定义的行为和未指定的行为是两件完全不同的事情。
实例化S&lt; int&gt;允许但不是必需的
例如:
template <class T =int>
struct S
{
operator int();
};
是允许但不是必需的。