Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::tr1导入std-合法吗?它提高了可移植性吗?_C++_Compatibility_Tr1 - Fatal编程技术网

C++ 将std::tr1导入std-合法吗?它提高了可移植性吗?

C++ 将std::tr1导入std-合法吗?它提高了可移植性吗?,c++,compatibility,tr1,C++,Compatibility,Tr1,我的C++03代码如下所示: #include <boost/tr1/unordered_map.hpp> ... std::tr1::unordered_map<std::string, int> mystuff; ... 是否合法(可能禁止将物品导入std中)?它会使移植/互操作C++11代码变得更容易吗?您不应该触摸std名称空间:即使它现在可以工作,以后也会引起严重的麻烦(使用新版本的编译器,在不同的编译器上,等等) 更新:引用标准(C++2003,第17.4.

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

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

是否合法(可能禁止将物品导入
std
中)?它会使移植/互操作C++11代码变得更容易吗?

您不应该触摸
std
名称空间:即使它现在可以工作,以后也会引起严重的麻烦(使用新版本的编译器,在不同的编译器上,等等)

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

对于C++程序,<>强> >对命名空间STD <强/>或命名空间内的命名空间添加声明或定义,除非另有说明。程序可以将任何标准库模板的模板专门化添加到命名空间标准中。这样的专门化(完整或部分)除非声明依赖于用户定义的外部链接类型,并且除非专门化满足原始模板的标准库要求,否则标准库模板的定义将导致未定义的行为。[我的重点]


C++11 17.6.4.2.1禁止将内容导入
::std

如果C++程序在名称空间<代码> STD<代码>中添加声明或定义,或在命名空间<代码> STD < /C>中的命名空间,除非另有说明,否则未定义。 我认为这与你所问的非常相似


特别是,我喜欢这样的回答:“使用autoconf检测符号的可用性,然后使用条件定义将正确的名称空间与给定的名称别名”。

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


tr1
的目的是将您的
std
tr1

中的内容隔离开来。我的编译器(VS2010)仍然理解
std::tr1
,尽管现在一切都存在于
std
中。我认为唯一有趣的答案是那些有一些事实支持的答案,比如“标准是怎么说的”@akappa:除非那些是琐事;)现在,当然,什么是和不是琐事是相当主观的。例如,我认为这是微不足道的,而你显然不这样做!MatthieuM.:这个网站充满了琐碎的问题,即答案很琐碎的问题。所以,要么我们决定不回答这些问题,要么我们同意“琐碎”在这个网站上没有任何意义,只有正确性和实事求是才有意义。@akappa:我建议中间路线:如果你认为它琐碎且不值得引用,那么就这样做,其他人会做出判断,你将能够适应:)@MatthieuM。-这正是本案发生的情况
namespace std
{
    using namespace ::std::tr1;
}
...
std::unordered_map<std::string, int> mystuff; // no tr1 now!
...