Я хочу форсировать создание шаблона.
Приведенный ниже код работает (выведите 1
) на g++ (http://coliru.stacked-crooked.com/a/33986d0e0d320ad4).
Однако в Visual C++ (https://rextester.com/WGQG68063) он печатает неверный результат (0
).
#include <iostream>
#include <string>
template <int& T>struct NonTypeParameter { };
//internal implementation
int lala=0;
template <typename T> struct Holder{
static int init;
};
template <typename T> int Holder<T>::init = lala++;
//tool for user
template <typename T> struct InitCRTP{
using dummy=NonTypeParameter<Holder<T>::init>;
};
class WantInit : public InitCRTP<WantInit>{};//user register easily
int main(){
std::cout << lala << std::endl;
}
Это ошибка компилятора Visual C++ или какое-то неопределенное поведение?
Если это ошибка Visual C++, как ее обойти (при этом оставаясь красивой)?
Изменить: Изменить класс → структура, как рекомендовал Макс Лангоф (и многие люди). Поблагодарить.
Щедрость Причина
С противоположными решениями от StoryTeller и Максима Егорушкина и их всесторонним обсуждением (спасибо!) Это звучит как нечеткая область правила C++.
Если это ошибка Visual C++, я хочу, чтобы проблема была достаточно достоверной, чтобы сообщить о ней.
Более того, я все еще желаю хорошего обходного пути, потому что этот метод очень полезен для создания пользовательских идентификаторов типов. Явная реализация не так удобна.
Примечание. Я вручил награду Каенбю Рин, потому что для меня это легко понять.
Это не означает, что остальные ответы являются менее правильными или менее полезными.
Я все еще не уверен, что является правильным. Читатели должны действовать с осторожностью.
В целях безопасности я предполагаю, что я просто не могу использовать эту функцию (пока). Всем спасибо.