Это "явное" ключевое слово.
template <typename T>
struct foo
{
explicit foo(T const *)
{
}
};
template <typename T>
struct bar
{
bar(T const *)
{
}
};
int main(int argc, char **argv)
{
int a;
foo<int> f = &a; // doesn't work
bar<int> b = &a; // works
}
Ключевое слово "явный" не позволяет конструктору использоваться для неявных преобразований типов. Рассмотрим следующие два прототипа функций:
void baz(foo<int> const &);
void quux(bar<int> const &);
С этими определениями попробуйте вызвать обе функции с указателем int:
baz(&a); // fails
quux(&a); // succeeds
В случае quux, ваш указатель int был неявно преобразован в столбец.
РЕДАКТИРОВАТЬ: Чтобы подробнее остановиться на комментариях других людей, рассмотрим следующий (довольно глупый) код:
void bar(std::auto_ptr<int>);
int main(int argc, char **argv)
{
bar(new int()); // probably what you want.
int a;
bar(&a); // ouch. auto_ptr would try to delete a at the end of the
// parameter's scope
int * b = new int();
bar(b);
*b = 42; // more subtle version of the above.
}