зачем добавлять пространство имен, например: std:: vector
Я видел производственный код, такой как
::std::vector<myclass> myvec;
Я понятия не имею, что знаком ::
mean однако - и почему он используется?
см., например:
5 ответов
ведущее":: "относится к глобальному пространству имен. Предположим, вы скажете namespace foo { ...
. Тогда std::Bar
относится к foo::std::Bar
, а ::std::Bar
относится к std::Bar
, что, вероятно, имел в виду пользователь. Поэтому всегда включая начальное ":: "может защитить вас от ссылки на неправильное пространство имен, если вы не уверены, в каком пространстве имен вы находитесь в настоящее время.
это полностью квалифицирует имя, так что только vector
шаблон пространство имен в глобальном пространстве имен. Это в основном означает:
{global namespace}::std::vector<myclass> myvec;
может быть разница, когда у вас есть объекты с одинаковым именем в разных пространствах имен. Для простого примера, когда это может иметь значение, рассмотрим:
#include <vector>
namespace ns
{
namespace std
{
template <typename T> class vector { };
}
void f()
{
std::vector<int> v1; // refers to our vector defined above
::std::vector<int> v2; // refers to the vector in the Standard Library
}
};
поскольку вам не разрешено определять свои собственные сущности в std
пространство имен, гарантируется, что ::std::vector
всегда будет относиться к стандартный контейнер библиотеки. std::vector
возможно, это относится к чему-то еще. .
этой всегда принимает vector
из стандартной библиотеки. std::vector
может быть mycompany::std::vector
если код, в котором я использую его, находится в пространстве имен mycompany
.
взяв пример -
int variable = 20 ;
void foo( int variable )
{
++variable; // accessing function scope variable
::variable = 40; // accessing global scope variable
}
начиная с:: означает сброс пространства имен в глобальное пространство имен. Это может быть полезно, если вы пытаетесь бороться с некоторой двусмысленностью в своем коде.