【问题标题】:Why does std::numeric_limits<SomeStruct>::infinity() "work"?为什么 std::numeric_limits<SomeStruct>::infinity() “工作”?
【发布时间】:2018-03-27 12:05:18
【问题描述】:

我不小心将默认可初始化的struct 输入到std::numeric_limits&lt;somestruct&gt;::infinity()。我得到的是一个默认结构。

为什么标准允许 this 编译并返回如此意外的值?

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

【问题讨论】:

  • 您缺少一个头文件。它在不包含&lt;limits&gt; 的情况下构建纯属巧合。而你得到的回报是什么
  • @Someprogrammerdude: "一个默认结构"
  • 您还期待什么?您没有告诉计算机对于您的 somestruct 类型而言“无限”意味着什么。
  • @LightnessRacesinOrbit 我可能在吹毛求疵,但“默认结构”不是“值”。
  • @Someprogrammerdude:这里它似乎是“我的班级的一个实例somestruct 及其唯一成员默认初始化”的缩写

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


【解决方案1】:

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

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

使用extra textinfinity() 是:

has_­infinity != false的所有专业都有意义

在你的情况下,numeric_limits&lt;somestruct&gt;::has_infinityfalse,所以 infinity() 没有意义。

【讨论】:

    【解决方案2】:

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

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

    您尚未定义任何专业化,因此您获得默认值。

    cppreference.com link

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 2017-05-11
      • 2011-02-15
      相关资源
      最近更新 更多