Здравствуйте, remark, Вы писали:
R>Во-первых, 14.7.1/5
R>R>If the overload resolution process can determine the correct function
R> to call without instantiating a class template definition, it is
R> unspecified whether that instantiation actually takes place. [Exam-
R> ple:
R> template <class T> struct S {
R> operator int();
R> };
R> void f(int);
R> void f(S<int>&);
R> void f(S<float>);
R> void g(S<int>& sr) {
R> f(sr); // instantiation of S<int> allowed but not required
R> // instantiation of S<float> allowed but not required
R> };
R> --end example]
R>Т.е. std::vector<Bar> может инстанциироваться в любом случае. Поведение unspecified. Поэтому разные компиляторы и компилируют по-разному.
Во-вторых, что бы воспользоваться SFINAE тебе надо сделать так, что бы получающееся выражение было
синтаксически некорректным, а не просто приводило бы когда-то к какой-то ошибке. Например, ошибке линковки или ран-тайм ошибке.
В твоём случае std::vector<Bar> синтаксически корректно, и при этом само это выражение не приводит к инстанциированию функций-членов std::vector<Bar>, в которых как раз уже и пытаются создать абстрактный класс. Поэтому на фазе поиска подходящих функций невозможно ничего определить.
R>