language-lawyer相关内容
以下问题: 类型转换:double to char:多个问题将无符号值赋给有符号字符 上下文:ISO/IEC 9899:202x (E) 工作草案 - 2020 年 2 月 5 日 C17..C2x N2479(已添加重点): J.3 实现定义的行为,J.3.5 整数 ——当值不能在该类型的对象中表示时,将整数转换为有符号整数类型的结果或引发的信号 (6.3.1.3).
..
有没有一种在 C 和 C++ 中都有效的类型双关语?最好是低开销,并避免琐碎的预处理器黑客攻击. 在 C89 中,我知道我可以这样做: unsigned int float_bits(float num) {return *(unsigned int *)#} 但是这违反了 C99 的严格别名规则.所以像这样的东西可能在各种 C 标准中更便携: unsigned int flo
..
假设我有一个接受 64 位整数的函数,我想调用它带有一个带有任意数值的 double (即它可能非常大量级,甚至无限): void DoSomething(int64_t x);双 d = [...];做某事(d); C++11 标准中 [conv.fpint] 的第 1 段是这样说的: 浮点类型的纯右值可以转换为整数类型.转换截断;也就是小数部分被丢弃.如果截断的值不能,则行为未定义以
..
假设我保证 float 是 IEEE 754 binary32.给定一个对应于有效浮点数的位模式,存储在 std::uint32_t 中,如何以最有效的标准兼容方式将其重新解释为 float?p> float reinterpret_as_float(std::uint32_t ui) {return/* 对 ui 应用魔法 */;} 我有几种方法我知道/怀疑/假设有一些问题: 通过 r
..
我正在检查有关缩小转换的标准,我认为对于缩小转换应该触发一个错误.因为 标准 说: [ 注意:如上所述,列表初始化中的顶层不允许进行此类转换.——尾注] 我认为“不允许"的描述意味着编译应该失败. 但是有人告诉我,这里只是说“程序格式错误",并且标准不会要求编译必须失败. 如果需要缩小转换(见下文)来转换元素到 T,程序是非良构的. 所以我的问题是:标准是否指定是否应
..
这是来自 C11 标准的引用: 6.5 表达式 ... 6 用于访问其存储值的对象的有效类型是对象的声明类型(如果有).如果通过具有非字符类型类型的左值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该类型的后续访问储值.如果使用 memcpy 或 memmove 将值复制到没有声明类型的对象中,或者复制为字符类型的数组,则修改对象的有效类型为该访问
..
例如,这里是 fread 的参考: size_t fread (void * ptr, size_t size, size_t count, FILE * stream); 读取一个计数元素数组,每个元素的大小为“大小字节"...那么有多少 BITS 会读取一个 fread(&x, 1, 1, stream)?八位还是CHAR_BIT? 解决方案 C99, §3.6: 字节
..
C99 的第 5.2.4.2.1 节将 SCHAR_MIN 定义为 -127,将 SCHAR_MAX 定义为 127.8 位有符号整数的范围不应该是 -128 到 +127? 我的编译器的 limits.h 将 SCHAR_MIN 定义为 (-1
..
我正在处理的代码使用了一些非常复杂的宏 voodoo 来生成代码,但最终有一个看起来像这样的构造 #define ARGS 1,2,3#define MACROFUNC_OUTER(PARAMS) MACROFUNC_INNER(PARAMS)#define MACROFUNC_INNER(A,B,C) A + B + Cint a = MACROFUNC_OUTER(ARGS); 期望得到的
..
对于 C++ 类型, 标头为我们提供了许多有用的编译时反射功能.例如.std::is_base_of::value 在编译时确定 B 是否是 D 的基类. 我想知道是否可以按照类似的方式检测命名空间成员资格?例如.给定一个类型为 T 的命名空间 N,有没有办法确定 T 是否包含在 N 中IS_NAMESPACE_MEMBER_OF(T,N) 形式的宏表达
..
如果重载->,显然->*不会自动工作,必须手动重载. 除了 -> 之外,为什么标准容器的迭代器不会重载 ->*,从而强制使用 (*iter).*mem_ptr 而不是 iter->*mem_ptr? #include #include 结构 S{诠释 x;};主函数(){标准::向量vec = {{42}};自动 mem_ptr = &S::x;std
..
为 std::string 创建 end(str)+1 的迭代器是否有效? 如果不是,为什么不是? 这个问题仅限于 C++11 及更高版本,因为在 C++11 之前,数据已经存储在一个连续块中 以这种方式存储. 我认为这可能会有所不同. std::string 与我推测的任何其他标准容器之间的显着区别在于,它总是包含比其 size 多一个元素,即零终止符,满足.c_str()的要求
..
鉴于 int foo[] = {0, 1, 2, 3}; 我想知道指向“一个过去的末端"的迭代器是否无效.例如:auto bar = cend(foo) + 1; 在 Stack 中有大量的抱怨和警告说这是“未定义的行为" 这样的溢出问题:c++ iterator + integer when past-end-iterator 的结果是什么? 不幸的是,唯一的来源是挥手. 我在购买时
..
当我使用时它是否正常工作(什么都不做) 向量五;v.erase(v.end()); 我想使用类似的东西 v.erase(std::find(...)); 我应该 if 是 v.end() 还是不是? C++.com 和 CPPreference 解决方案 标准并没有完全说明,但是 v.erase(q) 是定义的,“擦除指向的元素通过 [sequence.reqmts]
..
C++14 通过为值键入 0b 前缀来增加使用二进制文字的能力: int v = 0b1111;//15 十进制 但是对于 std::hex 或 std::oct 等流没有 std::bin 操纵器.所以我需要使用例如std::bitset 用于打印目的: std::cout (v)
..
考虑 #include 主函数(){双a = 1.0/0;双 b = -1.0/0;双 c = 0.0/0;std::cout
..
对于浮点值,是否保证a + b与1 b + a相同? 我相信这在 IEEE754 中得到了保证,但是 C++ 标准并未指定必须使用 IEEE754.唯一相关的文字似乎来自 [expr.add]#3: 二元+运算符的结果是操作数之和. 数学运算“和";是可交换的.然而,数学运算“sum"是也是关联的,而浮点加法绝对是 not 关联的.所以,在我看来,我们不能得出结论,“和"的交换性
..
这个话题在 StackOverflow 上出现过很多次,但我相信这是一个新的尝试.是的,我已阅读 Bruce Dawson 的文章 和 每个计算机科学家都应该知道的浮点运算和这个不错的答案. 据我了解,在典型系统上比较浮点数是否相等时存在四个基本问题: 浮点计算不精确 a-b是否“小"取决于a和b 的规模ab 是否“小"取决于a 和b 的类型(例如float、double、long
..
在 C++11 中,std::array 被定义为具有不比数组差的连续存储和性能,但我无法确定标准的各种要求是否意味着std::array 具有与普通数组相同的大小和内存布局.也就是说,您可以依靠 sizeof(std::array) == sizeof(int)*N 还是特定于实现? 特别是,这是否保证按您期望的方式工作: std::vector>x(M);typedef (*Array
..
如果我写 int 零 = 0;void *p1 = (void *)0;void *p2 = (void *)(int)0;void *p3 = (void *)(0/*no-op,但是会影响下一个零吗?*/, 0);void *p4 = (void *)0;//作为参考,这是一个指向零地址的指针无效 *p5 = 0;//作为参考,这是一个空指针无效 *p6 = NULL;//作为参考,这是一个
..