【发布时间】:2015-09-25 18:41:13
【问题描述】:
gcc-4.9.2 和 clang-3.8 在编译为 C++98 或 C++11 时都接受以下内容,
#include <cstdio>
template <typename T> void f(T) { printf("T\n"); }
template <> void f<int>(int) { printf("int\n"); } // explicit specialization
template <> void f<>(double) { printf("double\n"); } // explicit specialization -- 14.7.2(7)
template <> void f(float) { printf("float\n"); } // HERE
int main() {
f(1L); // T
f(10); // int
f(10.0); // double
f(10.0F); // float
}
我看到在 C++11 标准 §14.7.2(7) 中允许在显式模板特化中推导尾随模板参数,但我找不到标记为 HERE 的简洁形式是否被允许或如何被允许。
这些编译器是一致的还是某些扩展?
【问题讨论】:
-
这些都不是显式实例化。它们是明确的专业化。
-
@T.C. ups & 谢谢,现在修好了。
-
我没有标准中的确切引用,但我记得如果可以推断出类型,您至少可以在函数调用中省略尖括号。专业领域可能也允许这样做。
-
其实,我只是在 wandbox 上用 gcc3.6.3 和 c++03 运行这个例子,它也被接受了:melpon.org/wandbox/permlink/…
标签: c++ language-lawyer