std :: labs()究竟是什么?

msc*_*msc 46 c c++ prototype c++11 math-functions

std::abs()在浏览cppreference时读到了这个函数.

在那个页面上我也看到了一个std::labs()功能.它与其中一个std::abs()重载(一个用于long)具有相同的原型.

long abs( long n );

long labs( long n );
Run Code Online (Sandbox Code Playgroud)

long long abs( long long n );

long long llabs( long long n );
Run Code Online (Sandbox Code Playgroud)

所以,

  • 到底std::labs()是什么?
  • 我何时何地使用std::labs()
  • std::abs()和之间有什么区别std::labs()

Sto*_*ica 62

C++ 11是当std::labsstd::llabs加入.这是使用C99标准库对C++标准库进行部分同步的一部分.

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


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

template<typename T>
T run_func(T (&f)(T)) {
  return f({});
}
Run Code Online (Sandbox Code Playgroud)

然后试图打电话run_func(std::abs);是不正确的.我们需要明确指定模板参数或者std::abs转换为正确的类型.另一方面run_func(std::labs);不是暧昧,也不是太冗长.

不过,不太有用.

  • 我不确定我会跟着你,@鲁赫.不能期望任意但有效的C转换单元可以不经修改地成功编译为C++,除非有意写入以支持它.一个人可以,这确实是一个巧合.如果这样的代码恰好在两种语言中都具有相同的语义,那么这更是巧合.那么,在这个答案中如何使用"绝对巧合"这句话是无偿的? (7认同)
  • @ruakh - C++从一开始就破坏了兼容性.最简单的(和惯用的)`int*p = malloc(sizeof*p);`从来没有,也永远不会在C++中编译.根据我的知识,没有编译器允许从"void*"返回隐式转换.无论如何,这只是一个例子.如果你愿意的话,责备我迟钝,但我认为你的论点源于对语言的不完整看法. (7认同)
  • 回复:"一些C代码(纯属巧合也用C++编译器编译)":而且,大多数无偿使用"绝对巧合"这一短语的奖励都归于此... (6认同)
  • @ruakh - 此外,由于我使用这句话的背景是C99.对于可编译为C++的程序,编写它的人必须有意避免使用有用的构造,如指定的初始化程序和复合文字.使用完全独立的语言使自己"兼容"是不可能的. (3认同)
  • @Bobsleigh - 如果你根据他们的哲学比较它们,它们根本不会重叠.它们是两种语言,由两个独立的ISO委员会管理.这并非没有理由.C++可能会关心与C有一些互操作性,但它肯定从来没有打算让它的编译器成为C编译器的替代品. (2认同)
  • @ruakh,C++与现代C的兼容性有多高 - 甚至与C99 - 是一个定性的问题,你和我都不会解决.我甚至不确定我们是否同意如何衡量.最后,对我来说,重点是许多人错误地认为C++是C的超集,因此所有C代码都可以安全地编译为C++.这种假设应该在每个机会都受到挑战,因为它会导致悲伤,无论迟早.我不反对StoryTeller在这种追求中有点夸张,如果你选择这样做的话. (2认同)
  • 作为一个数据点,我正在将一个相对较小的C项目(大约10,000行)转换为C++.第一个切割只是使用C++ 11编译器而不是C99编译器并修复警告/错误.我是一个相当积极的C99用户.我必须做的更改:变量名为new,casting*alloc(),函数声明中的数组大小为静态,复合文字,结构中的枚举范围,可变长度数组,字符串文字为const char [] vs char [],和指定的初始化者.尽管并不是特别困难,但这不是一项微不足道的工作. (2认同)