std::uniform_int_distribution<std::size_t>是否属于未定义行为?

3
根据cppreference documentation on std::uniform_int_distribution,如果[IntType]不是以下之一: shortintlonglong longunsigned shortunsigned intunsigned longunsigned long long,则效果是未定义的。
对于std::size_t,我对以下三个问题不太确定:
一方面,据我所知,std::size_t通常是该列表中的一种无符号类型的typedef。
然而,我不确定标准是否要求始终如此。
我不确定“如果[IntType]不是以下之一,则未定义”是否意味着IntType必须与该列表中的某个内容名义上匹配(类型必须明确地是其中之一),还是它可以在结构上匹配(因此,对其中一种类型的typedef也被认为是可接受的)。
std::uniform_int_distribution是否属于未定义行为?

1
如果你不确定的话,那就试试这个static_assert(std::is_same_v<std::size_t, unsigned> || std::is_same_v<std::size_t, unsigned long> || std::is_same_v<std::size_t, unsigned long long>);。如果在任何编译器上失败(我觉得可能性很小),它会触发... - undefined
std::uniform_int_distribution<std::size_t>未定义行为吗?只要std::size_t在平台上是以下类型之一的typedef:short、int、long、long long、unsigned short、unsigned int、unsigned long或unsigned long long,那么它就是定义行为。在其他平台上,它是未定义行为。我不知道有任何一个std::size_t不是这些类型的平台。 - undefined
从另一个角度来看,假如你意外地遇到某个平台,其中size_t不是标准类型之一,那么你的程序其余部分能正常工作的几率有多大呢?这类似于“如果int是23位会发生什么?”标准规定它可以是这样的。 - undefined
1个回答

4
就我所知,std::size_t通常是该列表中无符号类型之一的typedef。
是的,通常是这样。
然而,我不确定标准是否要求始终如此。
不,从技术上讲,它也可以是unsigned char或实现定义的扩展无符号整数类型。前者对我来说似乎极不可能有意义,我也不知道后者的任何例子。
我不确定"undefined if [IntType] is not one of: ..."是否意味着IntType必须与该列表中的某个内容名义上匹配(类型必须明确为其中之一,按名称),还是它可以在结构上匹配(因此,对其中一个的typedef也被认为是可以接受的)。
这意味着模板参数指定的类型必须是列表中的一种。它的命名方式并不重要。无论如何,模板也无法检测到这一点。
实际上,std::size_t通常是unsigned intunsigned longunsigned long long中的一种。因此,您可以使用简单的static_assert来确保您不会在某些需要额外考虑的奇特平台上进行编译,正如问题下的评论中@Sheff'sCat所建议的那样。
static_assert(std::is_same_v<std::size_t, unsigned> || std::is_same_v<std::size_t, unsigned long> || std::is_same_v<std::size_t, unsigned long long>);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接