【发布时间】:2016-04-10 07:32:58
【问题描述】:
像下面这样将命名空间std::experimental 注入std 是好是坏?
namespace std
{
namespace experimental
{
}
using namespace experimental;
}
#include <experimental/optional>
int main()
{
std::optional< int > o;
return 0;
}
或者更现代的形式:
#if __has_include(<optional>)
# include <optional>
#elif __has_include(<experimental/optional>)
# include <experimental/optional>
namespace std
{
using namespace experimental;
}
#else
#error !
#endif
int main()
{
std::optional< int > o;
return 0;
}
引入std::experimental“子命名空间”的意图很明确,因为std::experimental 当前包含a plenty of new libraries。我认为很可能所有这些都将迁移到namespace std 而无需任何实质性更改,并且当前编写的用户代码可以依赖于此(我完全错了吗?)。否则,所有这些代码都应该被重构以在将来从std::experimental:: 更改为std::。这没什么大不了的,但可能有理由不这样做。
问题是关于生产代码和不太严重的代码。
【问题讨论】:
-
我们是在谈论可移植的生产代码吗?
-
@MikeMB 说,我们谈论的是开源大型广泛使用的项目(与人类生命安全无关)。
-
[namespace.std]:“除非另有说明,否则如果 C++ 程序将声明或定义添加到命名空间
std或命名空间std内的命名空间,则其行为未定义。”跨度> -
@user657267 因此应该将问题简化为“它是明确指定的还是隐含指定的?”?
-