将std :: tr1导入std - 是否合法?它是否提高了可移植性?

ana*_*lyg 14 c++ compatibility tr1

我有C++ 03代码,如下所示:

#include <boost/tr1/unordered_map.hpp>
...
std::tr1::unordered_map<std::string, int> mystuff;
...
Run Code Online (Sandbox Code Playgroud)

我开始想知道如果/当我将我的代码转换为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!
...
Run Code Online (Sandbox Code Playgroud)

它是否合法(可能std是禁止进口的东西)?是否可以更容易地使用C++ 11代码进行端口/互操作?

Att*_*ila 16

您不应该触及std命名空间:即使它现在有效,它也可能导致严重的麻烦(使用新版本的编译器,在不同的编译器上等).

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

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


Mik*_*our 7

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

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


归档时间:

查看次数:

755 次

最近记录:

13 年,9 月 前