这是合法的C ++代码吗?

时间:2012-02-28 22:49:07

标签: c++ standards

我对引用标准中的具体段落的答案感兴趣,而不仅仅是一般意见。

template <class T> struct wrapped
{
       wrapped(const T&) {}
};

template <class T> wrapped<T> wrappit(const T& x)
{
       return wrapped<T>(x);
}

template <class T> int run_function(const T& x, bool wrapped)
{
       if (wrapped) {
               return 0;
       } else {
               return run_function(wrappit(x), true) + 1;
       }
}

int main()
{
       const int result = run_function(0.5, false);
       return result;
}

2 个答案:

答案 0 :(得分:5)

符合要求的实施可能会拒绝此代码。见标准的附录B.

您的实施应包含其文档中的某些限制,其中包括:

  • 递归嵌套模板实例化

答案 1 :(得分:4)

从14.7.1(15):

  

实例化中无限递归的结果是未定义的。


关于您的代码:您不能使用if执行静态条件。相反,你需要某种功能方法和部分专业化:

template <typename T, bool> struct run_function;
template <typename T> struct run_function<T, true>
{
    static int go(T const & x) { return 0; }
};
template <typename T> struct run_function<T, false>
{
    static int go(T const & x)
    { return 1 + run_function<T, true>::go(wrappit(x)); }
};

现在没有更多的无限递归,因为这两个分支使用不同的模板,最终不会实例化其他模板。