将 std::tr1 导入 std - 合法吗?它是否提高了便携性
Importing std::tr1 into std - is it legal? Does it improve portability?
我有C++03代码,如下所示:
#include <boost/tr1/unordered_map.hpp>
...
std::tr1::unordered_map<std::string, int> mystuff;
...
我开始怀疑如果我/当我将我的代码转换为 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
命名空间:即使它现在有效,以后也会引起严重的头痛(使用新版本的编译器,在不同的编译器上等)。
更新:引用标准(2003 C++,第 17.4.3.1 节"保留名称")(在此处找到):
除非另有说明,否则C++程序未定义将声明或定义添加到命名空间 std 或命名空间 std 中的命名空间。程序可以将任何标准库模板的模板专用化添加到命名空间 std。标准库模板的这种专用化(完全或部分)会导致未定义的行为,除非声明依赖于用户定义的外部链接类型,并且除非专用化满足原始模板的标准库要求。[强调我的]
C++11 17.6.4.2.1 禁止将内容导入::std
:
除非另有指定,否则如果C++程序将声明或定义添加到命名空间
std
或命名空间std
中的命名空间,则未定义程序的行为。
我认为
这个问题与您提出的问题非常相似。
特别是,我喜欢答案,它说"使用 autoconf 检测符号可用性,然后使用条件定义为具有给定名称的正确命名空间别名"。
只有当你
有证据证明你不能以更清晰的方式支持一个特定的库时,才应该尝试这种可移植性,理想情况下,你应该用特定于该特定环境的#ifdef
来包围它。
tr1
的目的是将您的std
与tr1
中的东西隔离开来。
相关文章:
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 关于std::move的使用,是否有编译警告
- 通过网络、跨平台传递std::变体是否安全
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- std::vector::迭代器是否可以合法地作为指针
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 是否将std::packaged_task添加到现有线程
- C++中是否存在 std::conditional 的懒惰等价物?
- 检查某些类型是否是模板类 std::optional 的实例化
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- "std::list::splice(std::const_iterator pos, std::list&& other)"是否保证将"其他"留空?
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- "using namespace std;"是否免于过多代码规则?
- GCC 或 Clang '-std=' 是否有任何"moving target"别名值,表示"use the latest standard"?