为什么std :: numeric_limits <somestruct> :: infinity()“工作”?

时间:2018-03-27 12:05:19

标签: c++ templates language-lawyer std c++17

我意外地将默认初始化struct提供给std::numeric_limits<somestruct>::infinity()。我得到的是一个默认结构。

为什么标准允许这个编译并返回这样一个意外的值?

#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验证

2 个答案:

答案 0 :(得分:15)

&#34;为什么&#34;问题众所周知是无法回答的,但直接的答案是:it's specified

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

使用infinity() has_­infinity != false

  

numeric_limits<somestruct>::has_infinity

的所有专精都有意义

在您的情况下,falseinfinity(),因此MailApp.sendEmail(emailAdd, subject, message, {attachments: [theBlob]}); 没有意义。

答案 1 :(得分:5)

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

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

您还没有定义任何专业化,因此您将获得默认值。

cppreference.com link