gpt4 book ai didi

c++ - 如果模板别名声明解析为一个新的类型族?

转载 作者:行者123 更新时间:2023-11-30 02:28:21 25 4
gpt4 key购买 nike

考虑以下代码:

当我们使用模板别名时会发生什么,比如在 X 中?由于 Z 是 Y 的别名,特化 X 是否仍在使用?当我们使用模板别名时,如果模板别名声明解析为一个新的类型族,会发生什么?

#include <iostream>

template <template <typename> class>
struct X {
X() { std::cout << "1"; }
};

template <typename>
struct Y {};

template <typename T>
using Z = Y<T>;

template <>
struct X<Y> {
X() { std::cout << "2"; }
};

int main() {
X<Y> x1;
X<Z> x2;
}

output :21

最佳答案

别名只是一个别名,并没有引入新的类型家族。事实上,运行您的代码会打印出 22 - 这是因为 ZY 的别名,因此特化受到两次打击。

不幸的是,虽然 g++ 按预期打印 22,但 clang 打印 21。我怀疑这是由于 bug #26093 .事实上,将 template 模板转换为普通模板可以防止错误发生:

template <typename>
struct X {
X() { std::cout << "1"; }
};

struct Y {};
using Z = Y;

template <>
struct X<Y> {
X() { std::cout << "2"; }
};

int main() {
X<Y> x1;
X<Z> x2;
}

wandbox example

关于c++ - 如果模板别名声明解析为一个新的类型族?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40840734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com