为什么 std::numeric_limits<SomeStruct>::infinity() "work"?

Why does std::numeric_limits<SomeStruct>::infinity() "work"?

我不小心将默认的可初始化 struct 提供给了 std::numeric_limits<somestruct>::infinity()。我得到的是一个默认结构。

为什么标准允许编译这个 return 这样一个意想不到的值?

#include <iostream>

struct somestruct {
    uint64_t a = 7;
};

inline ::std::ostream& operator <<(::std::ostream& s, const somestruct& q) {
    s << q.a;
    return s;
}

int main(int argc, char **argv) {
    constexpr const auto inf = ::std::numeric_limits<somestruct>::infinity();
    std::cout << inf << std::endl;
    return 0;
}

Godbolt for compilation验证

根据 C++17 [numeric.limits]/1,相关函数的默认值是:

static constexpr T infinity() noexcept { return T(); }

您还没有定义任何特化,所以您使用默认值。

cppreference.com link

"Why" 问题是出了名的无法回答,但直接的答案是:这就是 it's specified:

namespace std {
  template<class T> class numeric_limits {
    // ...
    static constexpr T infinity() noexcept { return T(); }
    // ...
  };
}

infinity()extra text是:

Meaningful for all specializations for which has_­infinity != false

在您的情况下,numeric_limits<somestruct>::has_infinityfalse,因此 infinity() 没有意义。