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