2017-01-08 2 views
0

今日、誰かが次の形式のコードを私に提示:可変テンプレートを変異させることはできますか?

#include <iostream> 

namespace example { 
    template <typename T> 
    T variable_template = T(42); 
} 

int main() { 
    example::variable_template<int> = 10; 
    std::cout << example::variable_template<int> << std::endl; 
} 

あなたはそれがここで実行している見ることができます:http://coliru.stacked-crooked.com/a/3a786c42b5204b0a

10が表示された場合は、一時的に割り当てられるので、私は、42を印刷するには、このコードを予想しました。名前空間の内部では、テンプレートは宣言(インスタンス化ではない)だけであるため、名前空間の内部に変更するデータはありません。それにもかかわらず、それは私を驚かせ、代わりに10を印刷しました。

一時的な割り当てについての警告も期待されていましたが、それも起こりませんでした。

この定義されていない動作ですか、テンプレートの理解が間違っている、または何か他のことが起こっていますか?

+0

_「10は一時的に割り当てられているように見えるので、このコードでは42が表示されると思っていました。 –

答えて

4

テンプレートはインスタンスのみではなく宣言であるため、名前空間内に変更するデータはありません。

そうではありません!

[C++14: 14.7.2/6]:クラス、関数テンプレート、または変数テンプレートの特殊化の明示的なインスタンス化は、テンプレートが定義されている名前空間に配置されます。 [..]

あなたはクラステンプレートFooを持っている、とインスタンス化はテンプレートが持っていたのと同じ範囲で、普通のクラスのように存在していることを、インスタンス化(たとえば、Foo<int>)を参照してください。

変数テンプレートとは何も違いはありません。 example::variable_template<int>を参照すると、その変数をテンプレートを含むスコープに "追加"します。

あなたのネームスペースexampleには、variable_template<int>という変数が含まれています。


私はまた、一時的に割り当てに警告を期待し、それはどちらか起こらなかっただろう。

ここでは、T(42)以外の一時的なものはありません。

+0

ありがとうございます、あなたが追加することができる関連する標準的な見積もりはありますか? :) – OMGtechy

+0

@OMGtechy:そうではありません。私はテンプレートの章全体のほとんどを引用して、一時的なものであるという幻想を反証する必要があります:) –

+0

あなたが追加したものはまさに私が探していたものでした – OMGtechy

関連する問題