LINUX.ORG.RU

История изменений

Исправление DarkEld3r, (текущая версия) :

так как в MSVC2015 CTP5 все компилится и работает, а вроде как не должно

Там шаблоны немного иначе раскрываются (насколько знаю, это нарушает какие-то пункты стандарта, но какие конкретно не скажу и искать лень). Если на пальцах, то смысл следующий: компилятор должен проводить определённую диагностику до «раскрытия» (instantiation) шаблона. Ну а дальше - компилятор не смотрит на «зависимые имена» когда рассматриваются независимые, в данном случае, оператор разыменования. ГЦЦ и кланг так и делают, поэтому выдают ошибку ещё до конкретизации шаблона. Вот тут мы шаблон не используем, а ошибка есть.

MSVC на всё это забивает и поэтому в шаблонах можно писать полную ерунду и компилятору будет пофиг до тех пор пока не попробуешь шаблон «реально использовать». То есть дело даже не в зависимых типах, а просто в особенностях реализации. По крайней мере, раньше было именно так.

Исходная версия DarkEld3r, :

так как в MSVC2015 CTP5 все компилится и работает, а вроде как не должно

Там шаблоны немного иначе раскрываются (насколько знаю, это нарушает какие-то пункты стандарта, но какие конкретно не скажу и искать лень). Если на пальцах, то смысл следующий: компилятор должен проводить определённую диагностику до «раскрытия» (instantiation) шаблона. Ну а дальше - компилятор не смотрит на «зависимые имена» когда рассматриваются независимые, в данном случае, оператор разыменования. ГЦЦ и кланг так и делают, поэтому выдают ошибку ещё до конкретизации шаблона. Вот тут мы шаблон не используем, а ошибка есть.

MSVC на всё это забивает и поэтому в шаблонах можно писать полную ерунду и компилятору будет пофиг до тех пор пока не попробуешь шаблон «реально использовать». По крайней мере, раньше было именно так.