将 std::tr1 导入 std - 合法吗?它提高了便携性吗?

2024-04-02

我的 C++03 代码如下所示:

#include <boost/tr1/unordered_map.hpp>
...
std::tr1::unordered_map<std::string, int> mystuff;
...

我开始想知道如果/当我将代码转换为 C++11 时我会遭受痛苦,(我猜)C++11 没有std::tr1::unordered_map但有std::unordered_map反而。所以我想出了以下技巧:

namespace std
{
    using namespace ::std::tr1;
}
...
std::unordered_map<std::string, int> mystuff; // no tr1 now!
...

是否合法(也许将东西导入std是禁止的)?它会使与 C++11 代码的移植/互操作变得更容易吗?


你不应该触摸std命名空间:即使现在可以工作,以后也可能会引起严重的头痛(使用新版本的编译器,在不同的编译器上等)。

更新:引用标准(C++ 2003,第 17.4.3.1 节“保留名称”)(发现here https://www.securecoding.cert.org/confluence/display/cplusplus/MSC34-CPP.+Do+not+modify+the+standard+namespace):

It is 不明确的对于 C++ 程序将声明或定义添加到命名空间 std或命名空间 std 内的命名空间,除非另有说明。程序可以将任何标准库模板的模板专业化添加到命名空间 std。标准库模板的这种专门化(完整或部分)会导致未定义的行为,除非声明依赖于用户定义的外部链接类型并且除非专门化满足原始模板的标准库要求。 [强调我的]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 std::tr1 导入 std - 合法吗?它提高了便携性吗? 的相关文章

随机推荐