【问题标题】:What exactly is std::labs() there for?std::labs() 到底是为了什么?
【发布时间】:2018-03-08 13:02:15
【问题描述】:

我在浏览cppreference 时了解到std::abs() 功能。

在该页面上,我还看到了std::labs() 函数。它与std::abs() 重载之一(long 的一个)具有相同的原型。

long abs( long n );

long labs( long n );

long long abs( long long n );

long long llabs( long long n );

所以,

  • std::labs() 到底是做什么的?
  • 何时何地使用std::labs()
  • std::abs()std::labs() 有什么区别?

【问题讨论】:

    标签: c++ c c++11 prototype math-functions


    【解决方案1】:

    C++11 是在添加 std::labsstd::llabs 的时候。这是 C++ 标准库与 C99 标准库部分同步的一部分。

    在 C++ 代码中你并不真的需要它,因为我们有一个 long 重载 std::abs 几乎永远。但是,如果您有一些 C 代码(巧合的是也可以使用 C++ 编译器编译),并且它使用 labs,您可以使用 C++11 编译器和标准库来构建它。


    回想起来,这些功能有一个稍微有用的用例。这就是使用 std::abs 的尝试是模棱两可的。例如:

    template<typename T>
    T run_func(T (&f)(T)) {
      return f({});
    }
    

    然后尝试调用run_func(std::abs); 是不正确的。我们需要明确指定模板参数或将std::abs 转换为正确的类型。另一方面,run_func(std::labs); 不是模棱两可,也不是太冗长。

    不过,不是有用。

    【讨论】:

    • Re:“一些 C 代码(纯属巧合也可以用 C++ 编译器编译)”:最无偿使用“纯属巧合”一词的奖项授予 . . .
    • 我不确定我是否关注你,@ruakh。不期望任意但有效的 C 翻译单元可以在未经修改的情况下成功编译为 C++,除非它是有意编写的以支持这一点。在哪里可以,这确实是一个巧合。如果这样的代码碰巧在两种语言中都具有相同的语义,那么这更像是一个巧合。那么,在这个答案中使用“纯粹巧合”这个短语是如何无偿的呢?
    • @ruakh - C++ 从一开始就破坏了兼容性。最简单的(和惯用的)int *p = malloc(sizeof *p); 从来没有也永远不会在 C++ 中编译。据我所知,没有编译器允许从void* 进行隐式转换。无论如何,这只是一个例子。如果你愿意的话,怪我太迟钝了,但我认为你的论点源于对语言的不完整看法。
    • @ruakh - 此外,因为我使用该短语的上下文是 C99。为了使程序可以编译为 C++,编写它的人必须有意避免使用指定初始化程序和复合文字等有用的构造。使自己与完全独立的语言“兼容”是不可能的。
    • @Bobsleigh - 如果您根据他们的理念比较它们,它们根本不会重叠。它们是两种语言,由两个独立的 ISO 委员会管理。这并非没有道理。 C++ 可能希望与 C 有一些互操作性,但它肯定从未打算让其编译器成为 C 编译器的替代品。
    猜你喜欢
    • 1970-01-01
    • 2018-10-25
    • 2011-07-01
    • 2021-12-28
    • 1970-01-01
    • 2010-09-19
    • 2022-11-10
    • 1970-01-01
    • 2018-12-13
    相关资源
    最近更新 更多