通过 using 别名对类模板进行显式专业化应该有效吗?

问题描述 投票:0回答:1

首先,我正在做的事情似乎适用于所有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>()
}
c++ template-specialization
1个回答
4
投票

格式不正确。

参见 [温度规格通用]/3

在 [...] 类模板成员的显式特化声明中 [...] 显式特化的变量或类应使用 simple-template-id 指定。

A3
不是 simple-template-id

© www.soinside.com 2019 - 2024. All rights reserved.