gpt4 book ai didi

c++ - 模板别名如何影响模板参数推导?

转载 作者:IT老高 更新时间:2023-10-28 23:18:29 26 4
gpt4 key购买 nike

在 C++03 中,模板参数推导在某些情况下不会发生。例如:

template <typename T> struct B {};

template <typename T>
struct A
{
typedef B<T> type;
};

template <typename T>
void f(typename A<T>::type);

int main()
{
B<int> b;
f(b); // ERROR: no match
}

这里,int不推导出 T , 因为嵌套类型如 A<T>::type是非推断上下文。

如果我这样写函数:

template <typename T> struct B {};

template <typename T>
void f(B<T>);

int main()
{
B<int> b;
f(b);
}

一切都很好,因为B<T> 推断的上下文。

然而,在 C++11 中,模板别名可用于以类似于第二个示例的语法来伪装嵌套类型。例如:

template <typename T> struct B {};

template <typename T>
struct A
{
typedef B<T> type;
};

template <typename T>
using C = typename A<T>::type;

template <typename T>
void f(C<T>);

int main()
{
B<int> b;
f(b);
}

在这种情况下模板参数推导是否有效?换句话说,模板别名是推导上下文还是非推导上下文?或者他们是否继承了他们别名的推断/非推断状态?

最佳答案

In other words, are template aliases a deduced context or a non-deduced context?

它们与不使用模板别名的等效代码一样可演绎。例如

template<typename T>
using ref = T&;

template<typename T>
void f(ref<T> r);

现在您可以调用f(x)T将被完美演绎。在f的定义时已经,ref<T>被类型 T& 替换.和T&是推导出来的上下文。

在你的情况下 C<T>替换为 typename A<T>::type ,这是 T 的非推断上下文, 所以 T无法推断。

关于c++ - 模板别名如何影响模板参数推导?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8775202/

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