Это потому, что объявление construct
изменилось в C ++ 11 :
void construct( pointer p, const_reference val ); (1) (until C++11)
template< class U, class... Args >
void construct( U* p, Args&&... args ); (2) (since C++11)
Первое объявление вызывает конструктор копирования, в то время как второе объявление вызывает конструктор, которыйсоответствует заданному списку аргументов. Это может быть как конструктор копирования, так и другой конструктор, как вы видели в своем коде.
a.construct(p, 10)
вызывает конструктор копирования в C ++ 98, потому что 10
неявно преобразуется в Foo
черезFoo(int)
конструктор. Это преобразование не является необходимым в C ++ 11, поскольку существует соответствующий конструктор, который принимает int
(именно тот конструктор, который использовался для преобразования в C ++ 98). Это также причина, по которой код не работает в C ++ 98 при добавлении explicit
- он не может преобразовать 10
в Foo
тогда.