为什么没有stop_using命名空间指令

时间:2017-06-30 09:20:46

标签: c++ namespaces

问题:
是否存在技术原因导致为什么c ++中没有像stop_using namespace指令那样的东西?

你知道委员会是否考虑过它?或者它只是其中一个没有人发现有价值的功能来通过标准化过程来对抗它?

由于技术原因,我的意思是"它是不可实现的/会对查找规则造成严重破坏/会使编译器x倍慢/没有人知道它将如何与特征X交互......& #34;

背景
c ++社区中有很多关于何时以及是否适合使用using namespace的讨论。我的印象是它可能是一个更有用的工具,如果有一种方法来本地化它不需要局部范围的效果(如在函数体内部)。我之所以提出这个问题,是因为它与宏的情况类似。有时使用本地化的宏会使代码更具可读性,特别是更容易遵循干原则,但是您通常不希望它们泄漏到代码的其他部分,因此您#undef他们正确使用后。拥有相同的命名空间能力会很棒。

一个具体的例子,我的意思是:

// config.h
constexpr auto timeout1     = std::chrono::milliseconds{ 100 };
constexpr auto timeout2     = std::chrono::seconds{ 5 };
constexpr auto backoff_time = std::chrono::milliseconds{ 10 };
constexpr auto time_to_live = std::chrono::minutes{ 2 };
constexpr auto interval     = std::chrono::microseconds{ 300 };

会变成

// config.h
using namespace std::chrono_literals;

constexpr auto timeout1     = 100ms;
constexpr auto timeout2     = 5s;
constexpr auto backoff_time = 10ms;
constexpr auto time_to_live = 2min;
constexpr auto interval     = 300us;

stop_using namespace std::chrono_literals;

哪个更具可读性。

2 个答案:

答案 0 :(得分:1)

我认为它从未被提出过。

我见过人们使用以下技术解决限制:

// config.h

namespace config_detail
{

using namespace std::chrono_literals;

constexpr auto timeout1     = 100ms;
constexpr auto timeout2     = 5s;
constexpr auto backoff_time = 10ms;
constexpr auto time_to_live = 2min;
constexpr auto interval     = 300us;

}  // namespace config_detail

using config_detail::timeout1;
using config_detail::timeout2;
using config_detail::backoff_time;
using config_detail::time_to_live;
using config_detail::interval;

它并不完全令人满意,因为它确实涉及重复。

答案 1 :(得分:-1)

您想要的语法只是{ }。以你的例子:

{
  using namespace std::chrono_literals;

  constexpr auto timeout1     = 100ms;
  constexpr auto timeout2     = 5s;
  constexpr auto backoff_time = 10ms;
  constexpr auto time_to_live = 2min;
  constexpr auto interval     = 300us;
} // stop_using namespace std::chrono_literals;