AB
> All destructors found in the C++ standard library are non-throwing
И что, optional в такой ситуации умывает руки?
Size: a a a
AB
C
sizeof(std::size_t) = 4
.std::unordered_map<TKey>
, with sizeof(TKey) = 8
.std::unordered_map
uses std::hash
to calculate the hash of a key.std::hash
for unsigned long long (which is the same as TKey) in armv7a-linux-androideabi23-clang is the following:template <class _Tp, size_t = sizeof(_Tp) / sizeof(size_t)>6. Implementation
struct __scalar_hash;
template <class _Tp>
struct __scalar_hash<_Tp, 2>
: public unary_function<_Tp, size_t>
{
size_t operator()(_Tp __v) const _NOEXCEPT
{ /*...*./
return __murmur2_or_cityhash<size_t>()(&__u, sizeof(__u));
}
};
struct hash<unsigned long long>
: public __scalar_hash<unsigned long long>
{
};
std::hash
for unsigned long long (which is the same as TKey) in arm-linux-gnueabihf-g++ is the following:#define _Cxx_hashtable_define_trivial_hash(_Tp) \which is equivalent to
template<> \
struct hash<_Tp> : public __hash_base<size_t, _Tp> \
{ \
size_t \
operator()(_Tp __val) const noexcept \
{ return static_cast<size_t>(__val); } \
};
_Cxx_hashtable_define_trivial_hash(unsigned long long)
return static_cast<std::size_t>(key)
.__murmur
AT
~optional() noexcept(noexcept(declval<T>().~T())) {
...
}
m
std::optional::~optional()
не проставлен noexcept, то есть используется дефолт, который ничего не кидает.m
optional
, наверное, мог бы такое поддержать. Но вроде объекты кидающие из деструтора обычно реализуют scope guard'ы, поэтому их как раз не принято куда-то упаковывать.v
m
m
std::optional
должен был получить такой же noexcept в деструкторе, как тип лежажий в нем?AB
v
S
SS
S
IZ