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