gpt4 book ai didi

c++ - 如何避免 std::abs 产生意外结果?

转载 作者:可可西里 更新时间:2023-11-01 15:23:52 35 4
gpt4 key购买 nike

我遇到过几个不同的例子来说明 std::abs可能会产生意想不到的结果:

  1. 这个问题(On the std::abs function)指出<cstdlib> <cmath> 为整数类型提供重载为浮点类型提供重载。未能包含正确的 header 会导致未定义的行为,允许编译器静默接受
  2. C++ Defect report 2735指出 C++11 和 C++14 标准在技术上要求 std::abs(short)返回 double , 虽然大多数编译器忽略相关的措辞并返回 int .此问题的解决表明 C++17 中的措辞已更改,因此 std::abs(short)返回 int
  3. 这个问题的答案(When do I use fabs and when is it sufficient to use std::abs?)指出依赖std::abs可能导致难以发现的错误,因为(在现代 C++ 中)引入 std::abs 的 header 允许引入全局abs函数(可能有也可能没有相同的重载),很容易不小心使用 abs而不是 std::abs

我知道的修复是:

  1. 避免未定义的行为:包括 <cstdlib>如果评估 std::abs([integral type])<cmath>如果评估 std::abs([floating point type])
  2. 两个选项:
    • 使用 C++17 或 (C++11) 之前的版本
    • 解决 std::abs(short) 的问题可能会返回 intdouble取决于编译器是否符合 C++11/C++14 标准
  3. 两个选项:
    • 将标志传递给 gcc –Wconversion这样就可以调用 abs(2.0)在编译时触发警告
    • 使用技巧(改编自 n.m. 对 ( Disable math.h crap when working with cmath ) 的回答)来实现全局 abs模棱两可

技巧:

namespace neveruse{
int abs(int);
}

using namespace neveruse;

问题:是否有理由偏向于问题 3 中的一个解决方案而不是另一个?这些修复中的任何一个是否会引入我需要注意的其他潜在问题?

最佳答案

创建一个你自己的头文件,定义一个 inline 函数absolute,它又包含所有正确的头文件并修复返回类型的错误,并调用 std::abs.

然后,不要使用 absstd::abs(或任何名为 abs 的标记)。在 git commit(或您正在使用的任何版本管理系统)而不是在该文件中强制执行此操作。

关于c++ - 如何避免 std::abs 产生意外结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50194980/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com