您能告诉我我的应用程序中实际发生了什么吗?当我期望“ 0 1 2”时,我的程序的结果是“ 0 1 1”,依此类推...
#include <iostream>
template<int N>
struct counter {
friend constexpr int get(counter<N>);
};
template<int N>
struct writer {
friend constexpr int get(counter<N>) {
return N;
}
};
template<int N, bool B = noexcept(get(counter<N + 1>()))>
struct GetMaxCounter
{
static constexpr int max = GetMaxCounter<N + 1>::max;
};
template<int N>
struct GetMaxCounter<N, false>
{
static constexpr int max = N;
};
int main()
{
std::cout << GetMaxCounter<0>::max << std::endl;
writer<1>();
std::cout << GetMaxCounter<0>::max << std::endl;
writer<2>();
std::cout << GetMaxCounter<0>::max << std::endl;
}
当我第三次调用GetMaxCounter <0> :: max时会发生什么?模板参数B是否应重新评估为“ true”?
答案很晚,但是问题是由于您只有GetMaxCounter<N>
类的两个“版本”,即GetMaxCounter<N, false>
和GetMaxCounter<N, true>
。
基本上是max
成员在第一次调用GetMaxCounter<0,false>::max
时固定为GetMaxCounter<0>::max
(== 0),当调用writer<1>
时,GetMaxCounter<0,true>::max
被定义为GetMaxCounter<1, false>::max
(== 1) 。
无论您是否呼叫writer<2>
,任何后续的GetMaxCounter<0>
都将被评估为GetMaxCounter<0, true>
,其中GetMaxCounter<0, true>::max
先前已定义为GetMaxCounter<1, false>::max
,并且不会改变。