首先,我正在做的事情似乎适用于所有GCC/Clang/MSVC/icc/etc,所以我的问题是; 这是偶然的还是标准要求允许的?
在某种程度上,它似乎是东西的逻辑扩展,但另一方面,语法看起来很奇怪,我担心我想进入depending-on-bugs领域:
#include <type_traits>
template <int, bool>
void Bar();
template <int i>
struct A {
struct T : std::true_type {};
static void Foo() { Bar<i, T::value>(); }
};
// The normal way to do thing:
template <> struct A<1>::T : std::false_type {};
// But this also seems to work despite looking very odd:
using A3 = A<3>;
template <> struct A3::T : std::false_type {};
void Go() {
A<0>::Foo(); // Calls Bar<0, true>()
A<1>::Foo(); // Calls Bar<1, false>()
A<2>::Foo(); // Calls Bar<2, true>()
A<3>::Foo(); // Calls Bar<3, false>()
}
格式不正确。
参见 [温度规格通用]/3:
在 [...] 类模板成员的显式特化声明中 [...] 显式特化的变量或类应使用 simple-template-id 指定。
A3
不是 simple-template-id。