使用std::uniform_int_distribution<std::size_t>是否属于未定义行为?
使用
std::uniform_int_distribution<std::size_t>是否属于未定义行为? 结论先行:在所有主流编译器实现中,这完全安全,不会触发未定义行为;从严格标准文本角度,存在理论上的边缘可能性,但实际开发中绝不会遇到。
下面针对你的三个疑问逐一解释:
关于std::size_t的底层类型
C++标准明确std::size_t是无符号整数类型,且能容纳任意对象的字节大小。虽然标准没有强制要求它必须是unsigned int、unsigned long或unsigned long long的typedef,但所有符合标准的编译器,都会从这三个类型里选一个作为std::size_t的底层类型——毕竟这三个类型已经覆盖了所有平台的内存寻址需求,没必要新增特殊的无符号整数类型。
关于uniform_int_distribution的类型匹配规则
C++标准对这类模板参数的限制,看的是类型的实质,不是名称。typedef(或using)只是给现有类型起了个别名,不是定义新类型。比如你写using MyUInt = unsigned int;,那么std::uniform_int_distribution<MyUInt>和std::uniform_int_distribution<unsigned int>在编译器眼里完全等价,不会触发未定义行为。
最终结论
结合两点来看:
- 实际所有编译器中,
std::size_t的底层类型都是uniform_int_distribution允许的合法类型; - 只要底层类型合法,typedef别名就会被视为符合要求的模板参数。
所以你完全可以放心使用std::uniform_int_distribution<std::size_t>,不会有未定义行为的问题。
内容的提问来源于stack exchange,提问作者RaisinCrab
相关产品推荐
相关产品推荐

