Форвардное объявление объектов в контейнерах STL

Рассмотрим следующий фрагмент кода, где первая строка служит только как прямое объявление

 class A;

с последующим определением нового класса

class B
{
 vector<A> Av;  //line 1
 map<int, A> Am;  //line 2
 pair<int, A> Ap; //line 3
};

Строка 1 и строка 2, кажется, подходят для предварительного объявления (которое может сказать мне, что эти контейнеры используют тип указателя реализации), где строка 3 не компилируется в VS2012.

Мой вопрос заключается в том, что поведение диктуется стандартом или специфическим для компилятора, который я использую?

Спасибо