2

在模板中,我有一些仅对某些模板类型有效的功能。GCC 似乎对此很满意,但我不确定它是否有效。与典型的 SFINAE 不同,该函数本身不是模板。

template<typename T>
struct generic {
  T item;
  void get_limited() {
    item.limited();
  }
};

如果我不调用get_limited,可以用未实现的类型实例化此类limited吗?

如果没有,我该如何解决这个问题?我有一个通用容器类,其中某些功能基于它存储的分配启用(所以不是直接在上面的类型上,但仍然是模板参数)。

4

1 回答 1

5

模板函数是按需实例化的,所以如果没有使用该函数,它不一定是正确的,至少对于一些可能的实例化。该标准确实指出,如果模板对任何实例化类型均无效,则即使从未实例化,程序也是格式错误的(尽管编译器不需要对其进行诊断)。

此功能用于标准库的不同部分,其中单个函数的要求可能比模板对实例化类型的一般要求更严格。例如,std::map在一般情况下,值类型不需要是默认可构造的,但如果您想使用,operator[]那么它需要是,因为如果键不存在,该运算符可能需要创建一个空元素.

于 2013-08-05T13:26:57.847 回答