今日、誰かが次の形式のコードを提示してくれました。
#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 を出力しました。
一時的な割り当てに関する警告も期待していましたが、それも起こりませんでした。
これは未定義の動作ですか、テンプレートの理解に欠陥がありますか、それとも何か他のことが起こっていますか?