将类型添加到std
命名空间是否可以接受。例如,我想要一个对 TCHAR 友好的字符串,那么以下是否可以接受?
#include <string>
namespace std
{
typedef basic_string<TCHAR> tstring;
}
还是我应该使用自己的命名空间?
将类型添加到std
命名空间是否可以接受。例如,我想要一个对 TCHAR 友好的字符串,那么以下是否可以接受?
#include <string>
namespace std
{
typedef basic_string<TCHAR> tstring;
}
还是我应该使用自己的命名空间?
只允许专业化。因此,例如,您可以专门std::numeric_limits
针对您的类型。这当然必须发生在 namespace std::
。但是您的 typedef 不是专业化的,因此会导致未定义的行为。
不......命名空间的一部分是为了防止升级时的名称冲突。
如果您将内容添加到 std 命名空间,那么如果他们决定添加具有相同名称的内容,您的代码可能会在库的下一个版本中中断。
[C++11: 17.6.4.2.1/1]:
std
如果 C++ 程序将声明或定义添加到命名空间或命名空间内的命名空间,则 C++ 程序的行为是未定义的,std
除非另有说明。只有当声明依赖于用户定义的类型并且特化满足原始模板的标准库要求并且没有明确禁止时,程序才能将任何标准库模板的模板特化添加到命名空间 std。
您应该使用自己的命名空间,因为将代码添加到标准库只会使那些在线查找有关该添加的信息的用户感到困惑。
std 中的所有内容应该只是标准库,没有别的。
正式地,该标准说这是“未定义的行为”,并且可能会发生各种令人讨厌的事情。
在实践中,它会正常工作,但你仍然不应该这样做。除了让人们认为编译器提供了某些东西之外,它还能给你带来什么?
这是一个有趣的问题,因为它完全取决于项目和工程师接受的编码标准。
对于一个程序员来说,为什么不……小心点。
对于团队,制定标准...
对于跨平台项目,地狱是的。
否则,nawdawg。
我完全同意其他答案,即您应该将类型放在自己的命名空间中以避免不幸的名称冲突。
但是,我想明确指出,有时您可以(并且应该!)在 std 命名空间中添加内容。例如 std::swap 方法的模板特化就是这种情况,它用于提供交换对象的统一方式。有关此问题的更多信息,您可以阅读有关非抛出交换习语的信息。