为什么 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;
}
根据 C++17 [numeric.limits]/1,相关函数的默认值是:
static constexpr T infinity() noexcept { return T(); }
您还没有定义任何特化,所以您使用默认值。
"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_infinity
是 false
,因此 infinity()
没有意义。
我不小心将默认的可初始化 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;
}
根据 C++17 [numeric.limits]/1,相关函数的默认值是:
static constexpr T infinity() noexcept { return T(); }
您还没有定义任何特化,所以您使用默认值。
"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_infinity
是 false
,因此 infinity()
没有意义。