【问题标题】:same comparison of different numeric types不同数值类型的相同比较
【发布时间】:2019-07-09 07:37:28
【问题描述】:

我想比较几种数字类型的两种变体。

#include <cstdint>
#include <variant>

using Value = std::variant< uint64_t, int64_t, bool, float, double>;

bool compare(Value l, Value r){
    return std::visit([](auto v1,auto v2){return v1<v2;},l,r);
}

https://godbolt.org/z/ULCfVk

但是,在 msvc 上,这会导致警告。

这样安全吗? (又名在所有情况下都给出了预期的结果)

如果不是,如何安全完成?

【问题讨论】:

    标签: c++ visual-c++ compare c++17 variant


    【解决方案1】:

    这样安全吗?

    取决于您认为“安全”的内容。您的代码不涉及未定义的行为或此类事情,但它肯定会导致意想不到的结果。示例:

    Value v1 = std::int64_t{std::numeric_limits<std::int64_t>::min()};
    Value v2 = std::uint64_t{42};
    
    // Isn't v1 < v2? This assertion will fire...
    assert(compare(v1, v2));
    

    这里的问题是,您的包罗万象的访问者(通用 lambda)不会区分类型,并且会愉快地将有符号整数值与无符号整数值进行比较。前者转换为后者,产生较大的值,比较返回true。

    如果不是,如何安全完成?

    您可以向访问者函数对象添加额外的重载。看看overloaded 机械here。这样,只要比较需要它做正确的事情(即返回预期的结果),您就可以区分变体所拥有的类型。

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多