【问题标题】:candidate standard functions for 'using'“使用”的候选标准函数
【发布时间】:2011-04-01 07:58:03
【问题描述】:

我知道using std::swap 的技术可以通过ADL 启用用户定义的swap 函数,但我不知道这也应该应用于其他一些函数。例如,我在模板代码中滥用std::abs,而我应该使用类似的东西:

template <class Int> void f(Int i) {
    using std::abs;
    Int j = abs(i);
    // ...
}

你能想到哪些标准函数应该这样使用?

附带说明:当包含cstdlib 时,g++ 将abs 放入全局命名空间中(实际上ctsdlib 包含stdlib.h(它定义了函数 abs)并且确实#undef abs...),标准是怎么说的?

【问题讨论】:

  • 当前标准规定&lt;cstdlib&gt; 应该只在命名空间内提供函数。新的 C++11 标准将允许 g++(和大多数其他编译器)已经完成的工作。

标签: c++ generics idioms


【解决方案1】:

这是来自标准:

3.4.6 使用指令和命名空间别名
[basic.lookup.udir]
在 using 指令中查找命名空间名称时或 命名空间别名定义,仅命名空间 名称被考虑。

因此,您可以使用关键字using 将变量、类型和函数导入当前命名空间。


编辑

你可以将任何你喜欢的东西导入当前命名空间,但你应该注意命名空间污染,因此尽量不要在标题中使用using,而只能在源文件中使用。

理想情况下,您不应使用此关键字。当我有深度嵌套的命名空间时,我有时会使用它。

【讨论】:

  • 这回答了可以使用“使用”导入的内容,而不是应该导入的内容
  • @jk 对,因为这取决于个人喜好和编码标准。无论如何,我扩展了我的答案
  • 对于std::abs 示例,不是我“喜欢”导入它,而是我必须(除非存在其他解决方案?)以便我的代码使用类整数类型编译,std 库未知,但提供了自己的abs 版本。
  • @rafak 必须?如果您不将 abs 导入当前命名空间,您能否发布一个失败的示例?
  • 假设abs 没有放在全局命名空间中:struct I { I(int i=0) : i(i) {} int i; }; I abs(I i) { return std::abs(i.i); } int main() { I i(-1); i = std::abs(i); /* error! */ using std::abs; i = abs(i); /* OK! */}。另一方面,如果I 是int,则上面的代码只会编译,因为std::abs 是用using 来实现的
猜你喜欢
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 2017-07-28
  • 2012-12-03
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多