14

我有如下所示的 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 代码互操作变得更容易吗?

4

4 回答 4

16

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

更新:引用标准(C++ 2003,第 17.4.3.1 节“保留名称”)(在此处找到):

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

于 2012-05-24T10:55:53.020 回答
7

::stdC++11 17.6.4.2.1 禁止将内容导入:

std如果 C++ 程序将声明或定义添加到命名空间或命名空间内的命名空间,则 C++ 程序的行为是未定义的,std除非另有说明。

于 2012-05-24T11:13:51.943 回答
3

我认为这个问题与你所问的非常相似。

特别是,我喜欢“使用 autoconf 来检测符号可用性,然后使用条件定义为具有给定名称的正确命名空间的别名”的答案。

于 2012-05-24T11:15:27.880 回答
1

仅当您有证据证明您无法以更清晰的方式支持特定库时才应尝试这种可移植性,并且理想情况下,您应该用#ifdef特定于该特定环境的 s 围绕它。

的重点tr1是将您stdtr1.

于 2012-05-24T11:35:59.837 回答