language-lawyer相关内容

实现可以将提示视为实际语句吗?

在 C 中,register 存储限定符是一个提示,表明应尽可能快地访问此类标识符(例如,存储在 CPU 寄存器中). §6.7.1具有存储类说明符寄存器的对象标识符声明表明对对象的访问尽可能快.此类建议的有效程度由实施定义. 和 §6.7.3 限制限定符的预期用途(如寄存器存储class) 是为了促进优化 [...] 但是,我听说过实现(特别是在嵌入式系统中发现),其中 ..
发布时间:2022-01-25 12:40:54 其他开发

临时对象最初是 const 吗?

这个代码是 UB 吗? 结构 A{无效非常量(){}};常量 A&a = A{};const_cast(a).nonconst(); 换句话说,(临时)对象最初是const吗?我浏览了标准,但找不到答案,因此希望能引用相关部分的内容. 编辑: 对于那些说 A{} 不是 const 的人,那么你能做到 A{}.nonconst() ? 解决方案 引用a的初始化由[dcl.i ..

如果从未通过它们进行修改,是否允许对实际 const 对象的引用进行 const 转换?

我有一个声明 const 和非常量成员函数的抽象类.为了便于讨论,假设它看起来像这样: 类记录接口{上市:虚拟 ~record_interface() = 默认值;虚拟 void set_foo(BoundedFloat) = 0;虚拟 BoundedFloat get_foo() const = 0;}; 这用作记录的高级表示,当保存到磁盘并通过线路传输时,该记录具有不同的表示.所以大多数实 ..
发布时间:2022-01-23 23:47:39 C/C++开发

抛弃函数参数的常量是未定义的行为吗?

假设我有这个 C 函数(以及头文件中的相应原型) void clearstring(const char *data) {字符 *dst = (字符 *) 数据;*dst = 0;} 上述代码中是否存在未定义行为,将 const 丢弃,还是只是一种非常糟糕的编程习惯? 假设没有使用 const 限定的对象 字符名[] = "pmg";清除字符串(名称); 解决方案 尝试写入 *ds ..
发布时间:2022-01-23 23:30:53 其他开发

函数参数的破坏顺序是什么?

如果某个函数 f 带有参数 p_1, ..., p_n 类型为 T_1, ..., T_n 分别用参数 a_1, ..., a_n 调用,其主体以什么顺序抛出异常、完成或返回论据被破坏了吗?为什么?如果可能,请提供对标准的参考. 编辑:我实际上想问一下函数“参数",但作为 T.C.Columbo 设法消除了我的困惑,我将把这个问题留给论点,并问 一个关于参数的新问题.请参阅对此问题的评论以了 ..
发布时间:2022-01-21 22:06:28 C/C++开发

std::tuple 内存对齐

对于元组的伪成员的布局和内存对齐是否有任何正式的规范? 有没有办法修改元组中类型的内存对齐方式?是否受#pragma pack() 指令影响? 例如: typedef std::tuple;我的元组; 是否有任何规范说明这将在内存中与以下内容相同: #pragma pack()//默认打包结构我的结构{uint8_t 优先;uint32_t 秒;} 抱歉,如果这是一个愚蠢的问题 ..
发布时间:2022-01-19 23:53:46 C/C++开发

_Bool 类型和严格别名

我试图编写一些宏以安全地使用 _Bool,然后对我的代码进行压力测试.为了邪恶的测试目的,我想出了这个肮脏的黑客: _Bool b=0;*(无符号字符*)&b = 42; 鉴于 _Bool 在实现 sizeof(_Bool)==1) 上是 1 个字节,我看不出这种 hack 是如何违反 C 标准的.这不应该是严格的别名违规. 然而,当通过各种编译器运行这个程序时,我遇到了问题: #in ..
发布时间:2022-01-19 17:35:02 其他开发

返回值的复制构造函数何时发生

我有以下成员函数: Person ClassB::DoSomethingAndReturnPerson(){RAIIMutex myLock(&m_mutex);返回 m_person;} RAIIMutex 是一个辅助类,它接收互斥体并将其锁定在构造函数中并在析构函数中释放. m_person 属于 Person 类型(尺寸非常小).其他线程中的其他函数可能会更改此成员. 我想按 ..
发布时间:2022-01-19 15:19:28 C/C++开发

为什么在返回从函数的返回类型派生的类型的本地对象时不选择移动构造函数?

以下代码被 Clang 和 GCC(主干版本): #include 结构基础{Base() = 默认值;Base(Base const&) = 删除;Base(Base&&) = 默认值;};结构派生:基础{派生()=默认;Derived(Derived const&) = 删除;派生(派生&&)=默认;};自动 foo()->根据{导出d;返回 d;//这里有错误} 导致以下 ..
发布时间:2022-01-19 15:00:51 C/C++开发