cycle
定义中的递归在哪里中断?
#include <iostream>
using namespace std;
template<typename T>
struct Recursive
{
using cycle = struct X : Recursive<X> {}; // would work for Recursive<T> as well
};
int main()
{
Recursive<int> x;
return 0;
}
令我惊讶的是上面的代码compiles - 它是一段有效的代码吗?如果是,cycle
类型的含义是什么(简要描述)?
答案 0 :(得分:4)
struct X : Recursive<X>
是奇怪重复模板模式的一个示例,但除非您访问嵌套的cycle
类型,否则会发生无限递归。例如。 decltype(x)::cycle
与decltype(x)::cycle::cycle
的类型不同。
#include <iostream>
#include <type_traits>
#include <typeinfo>
#include <cxxabi.h>
using namespace std;
template<typename T>
struct Recursive
{
using cycle = struct X : Recursive<X> {};
};
int main()
{
int status;
Recursive<int> x;
std::cout << abi::__cxa_demangle(typeid(x).name(), 0, 0, &status) << '\n';
std::cout << abi::__cxa_demangle(typeid(decltype(x)::cycle).name(), 0, 0, &status) << '\n';
std::cout << abi::__cxa_demangle(typeid(decltype(x)::cycle::cycle).name(), 0, 0, &status) << '\n';
return 0;
}
打印
Recursive<int>
Recursive<int>::X
Recursive<Recursive<int>::X>::X
因此,只有当您明确访问另一个嵌套的cycle
类型时,才能继续进行重复注释。