2012-02-28 15 views
-2

私は、一般的な意見だけでなく、標準の具体的な一節を挙げて答えに興味があります。この正当なC++コードですか?

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; 
} 
+0

これは何をする予定ですか?それがすることは、 'main'を回帰的に返すことだけです。 –

+6

あなたはそれが違法だと思いますC++?不定期のインスタンス化の深さは、愚かなコンパイラを殺す可能性が最も高いという事実にもかかわらず?つまり、 "int main(){}"は合法なC++コードですか?それについて私は標準の一節を見つけてください。 –

+1

"legal"という単語の定義についての質問ですか?私はコンパイラがTを 'wrapped Qwertie

答えて

4

(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)); } 
}; 

が今何より無限再帰ありません。代わりに、あなたは、いくつかの機能的なアプローチの並べ替え、および部分特殊が必要になります。

+0

提案をありがとうが、実行時にブールスイッチを設定する必要があります。これを修正する正しい方法は、最初の関数とは異なる関数を呼び出すことです。 –

5

準拠している実装では、このコードを拒否することがあります。標準の附属書Bを参照のこと。

あなたの実装は、そのドキュメントに一定の制限を含めることになって、これらが含まれます:14.7.1から

  • 再帰的にネストされたテンプレートのインスタンス
+1

ベン、私はすべてのコンパイラは、再帰的な入れ子のインスタンス化のためか、または彼らがクラッシュするか、またはメモリが不足し、クラッシュするまで無限ループに詰まっているので、それを拒否すると思います.-D –

+0

@Vlad:十分にスマートなオプティマイザは、再帰。 –

+0

GCCはスマートです!ウーホー! –

関連する問題