gpt4 book ai didi

c++ - 解构表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:27 25 4
gpt4 key购买 nike

引用SFINAE , 括号内的表达式如何解构?

template <int I> void div(char(*)[I % 2 == 0] = 0) {
// this overload is selected when I is even
}
template <int I> void div(char(*)[I % 2 == 1] = 0) {
// this overload is selected when I is odd
}

我正在尝试阅读这个重载决议,假设我是偶数,并遵守运算符优先级规则:

deconstruct 1: template<int I> div(char (*) [1] = 0) //since I % 2 == 0

那么上面的读法是否正确:

模板函数div需要一个函数指针参数,其签名为char (*) [int I = 1],默认为0或NULL?

感谢您的想法。

最佳答案

如果我们称它为div<21> , 编译器尝试替换 I = 21到模板中。我们得到:(__div21是代入后的假设函数的名称)

void __div21(char(*)[0] = 0) {
// this overload is selected when I is even
}
void __div21(char(*)[1] = 0) {
// this overload is selected when I is odd
}

零长度数组格式错误,因此第一个版本是替换失败。它已从重载决议中删除。第二个版本没问题,所以它参与了重载决议。因此,div<21>调用第二个重载。


如果我们称它为div<42> , 编译器尝试替换 I = 42到模板中。我们得到:(__div42是代入后的假设函数的名称)

void __div42(char(*)[1] = 0) {
// this overload is selected when I is even
}
void __div42(char(*)[0] = 0) {
// this overload is selected when I is odd
}

零长度数组格式错误,因此第二个版本是替换失败。它已从重载决议中删除。第一个版本没问题,所以它参与了重载决议。因此,div<42>调用第一个重载。


从 C++17 开始,我们可以使用 if constexpr 使代码更容易理解。构造:

template <int I>
void div()
{
if constexpr (I % 2 == 0)
/* handle even case */;
else
/* handle odd case */;
}

关于c++ - 解构表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57105173/

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