繁体   English   中英

具有类型转换的模板专业化

[英]Template specialization with type conversion

我发现了这段伪造的代码(下面的人为例子):

template <int I, typename T>
struct foo
{
    static int bar()
    {
        return 1;
    }
};

template <std::size_t Index, typename T>
struct foo<Index, T*>
{
    static int bar()
    {
        return 2;
    }
};

请注意,专业化使用不同的类型(错误)。 令人惊讶的是,它在没有GCC 4.8.1和Clang 3.4的任何错误(或警告)的情况下进行编译。 但更奇怪的是GCC行foo<0, int*>::bar()产生1 ,但Clang会给出2 到底是怎么回事? 是否仍然被标准视为专业化?

Gcc错了,因为你根本就不能称之为专业化。 只需删除主模板定义:

template <int I, typename T>
struct foo;

template <std::size_t Index>
struct foo<Index, int*> {
  static int bar() {
    return 2;
  }
};

int main() {
  std::cout << foo<std::size_t(0), int*>::bar() << std::endl; // nope, not work
  std::cout << foo<0, int*>::bar() << std::endl; // nope, not work
}

查看实例 并且代码必须报告模糊的部分特化,但它不是(对于gcc)。 Clang 报告 “暧昧”。

PS我认为,这部分标准不够。

更新

在这种情况下,clang不适用于枚举例如

在非类型模板参数14.5.5 [temp.class.spec]第8段上部分特化类模板的限制列出了以下限制:

除非参数表达式是简单标识符,否则部分专用的非类型参数表达式不应涉及部分特化的模板参数。

使用size_t的参数表达式涉及到int的转换( size_t是无符号的),因此不是简单的标识符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM