language-lawyer相关内容

我可以使用 NULL 代替 0 的值吗?

我可以使用 NULL 指针代替 0 的值吗? 或者这样做有什么问题吗? 例如: int i = NULL; 替代: int i = 0; 作为实验,我编译了以下代码: #include int main(void){int i = NULL;printf("%d",i);返回0;} 输出: 0 确实它给了我这个警告,它本身是完全正确的: 警告:初始化从指针生成整数 ..
发布时间:2022-01-06 22:55:19 C/C++开发

在 c++0x 中删除 nullptr 仍然安全吗?

在c++03 中,很明显删除空指针没有效果.事实上,§5.3.5/2 中明确指出: 无论哪种方式,如果 delete 的操作数的值是空指针,则操作无效. 但是,在当前草案中,c++0x 这句话好像少了.在草案的其余部分,我只能找到说明如果 delete-expression 的操作数不是空指针常量会发生什么的句子.删除空指针是否仍然在c++0x中定义,如果是,在哪里? 注意事项: ..
发布时间:2022-01-06 22:32:32 C/C++开发

C++ - 为什么不能使用“const"限定符创建静态成员函数

今天我遇到了一个问题.我需要一个 static 成员函数,const 不是必须的,而是更好的.但是,我的努力没有成功.有人能说出原因或方式吗? 解决方案 当您将 const 限定符应用于非静态成员函数时,它会影响 this 指针.对于 C 类的 const 限定成员函数,this 指针的类型是 C const*,而对于不是const 限定,this 指针的类型为 C*. 静态成员函数 ..
发布时间:2022-01-05 20:09:48 C/C++开发

是“重新绑定"吗?C++ 中的引用像这样合法吗?

以下在 C++ 中合法吗? 据我所知,Reference 有一个微不足道的析构函数,所以它应该是合法的. 但我认为引用不能合法反弹......他们可以吗? template结构参考{T&r;参考(T&r):r(r){}};int main(){整数 x = 5, y = 6;参考r(x);新的(&r)参考(y);} 解决方案 我想我在下面的一段话中找到了答案,“引用"了一段 ..
发布时间:2022-01-05 12:11:02 C/C++开发

右值、左值和形式定义

人们在听到这句话时会感到困惑 int&&X x 具有右值引用类型,但 x 是左值.误解源于这样一个事实,即标识符和表达式是不同的东西,类型和值类别也是如此.此外,表达式的类型是“在进一步分析之前进行调整",“rvalue"和“lvalue"这两个词可以出现在类型名称和值类别名称中. 我想澄清正式定义.假设我们有一个函数: 1 |void f(int&& x) {2 |... = x;3 ..
发布时间:2022-01-05 12:03:51 C/C++开发

悬空引用和未定义行为

假设一个悬空引用x.只是写是未定义的行为 &x; 甚至 x; ? 解决方案 首先,非常有趣的问题. 我会说这是未定义的行为,假设“悬空引用"意味着“被引用对象的生命周期已经结束,并且对象占用的存储已经被重用或释放."我的推理基于以下标准规则: 3.8 §3: 本国际标准中赋予对象的属性仅适用于给定的对象在它的一生中.[注意:特别是在对象的生命周期开始之前和生命周期 ..
发布时间:2022-01-05 11:52:26 C/C++开发

可以空引用吗?

这段代码是否有效(和定义的行为)? int &nullReference = *(int*)0; g++ 和 clang++ 编译时没有任何警告,即使使用 -Wall、-Wextra、-std=c++98, -pedantic, -Weffc++... 当然引用实际上不是空的,因为它不能被访问(这意味着取消引用一个空指针),但我们可以通过检查它的地址来检查它是否为空: if( & nu ..
发布时间:2022-01-05 11:38:58 C/C++开发

Linux 内核的 __is_constexpr 宏

Linux 内核的__is_constexpr(x) 宏是如何工作的?它的目的是什么?什么时候介绍的?为什么要介绍? /** 这将返回一个常量表达式,同时确定一个参数是否为* 一个常量表达式,最重要的是不评估参数.* 荣耀归于 Martin Uecker */#define __is_constexpr(x) \(size ..
发布时间:2022-01-04 22:17:52 其他开发

纯函数:“无副作用"吗?暗示“总是相同的输出,给定相同的输入"?

定义一个函数为pure的两个条件如下: 无副作用(即只允许更改本地范围) 给定相同的输入,总是返回相同的输出 如果第一个条件总是成立,那么第二个条件是否也有不成立的时候? 即真的只有第一个条件才有必要吗? 解决方案 以下是一些不改变外部作用域但仍被视为不纯的反例: function a() { return Date.now();} function b() { ..

什么是“回调地狱"?以及 RX 如何以及为什么解决它?

谁能给出一个明确的定义,并举一个简单的例子来解释什么是不了解 JavaScript 和 node.js 的人的“回调地狱"? “回调地狱问题"什么时候(在什么样的设置下)发生? 为什么会发生? “回调地狱"总是与异步计算有关吗? 或者“回调地狱"是否也会出现在单线程应用程序中? 我参加了 Coursera 的响应式课程,Erik Meijer 在他的一次讲座中说 RX ..

可以在 C++ 中实现 XOR 链表而不会导致未定义的行为吗?

XOR 链表 是普通链表的修改版本双向链表,其中每个节点只存储一个“指针"而不是两个.该“指针"由下一个指针和前一个指针的异或组成.要遍历列表,需要两个指针——一个指向当前节点,一个指向下一个或上一个节点.为了向前遍历,将前一个节点的地址与当前节点中存储的“指针"进行异或运算,揭示真正的“下一个"指针. C++ 标准会导致对指针和整数的一系列操作导致未定义的行为 - 例如,您不能保证在数字中 ..
发布时间:2022-01-01 18:21:11 C/C++开发

是类型(::x);有效的?

虽然讨论Type(identifier); 语法以及它是如何声明的,我遇到了 Type(::x); 不适用于 Clang.我希望给定一个全局变量 x,它会将 ::x 视为一个表达式(::x + 2 有效)并强制转换::x 到 Type.但是,它会导致编译器错误. 这是一个简短的例子: int x;int main() {int(::x);//不编译int(::x + 2);//编译} C ..

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

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

通过 void* 进行转换,而不是使用 reinterpret_cast

我正在读一本书,我发现不应该直接使用 reinterpret_cast,而是将转换为 void* 与 static_cast 结合使用: T1 * p1=...无效 *pv=p1;T2*p2=static_cast(pv); 代替: T1 * p1=...T2*p2=reinterpret_cast(p1); 然而,我找不到解释为什么这比直接演员更好.如果有人能给我一个解释或指出我的答案, ..

有效的无符号到有符号转换避免实现定义的行为

我想定义一个函数,它接受一个 unsigned int 作为参数,并返回一个 int 全等模 UINT_MAX+1 给参数. 第一次尝试可能如下所示: int unsigned_to_signed(unsigned n){返回 static_cast(n);} 但任何语言律师都知道,对于大于 INT_MAX 的值,从无符号转换为有符号是实现定义的. 我想实现这一点,以便 (a) 它 ..
发布时间:2021-12-31 21:33:51 C/C++开发

如果从不通过它们修改对实际 const 对象的引用,是否允许 const-casting 掉其常量性?

我有一个抽象类,它声明了常量和非常量成员函数.为了便于讨论,我们假设它看起来像这样: class record_interface{上市:虚拟 ~record_interface() = 默认值;虚拟无效 set_foo(BoundedFloat) = 0;virtual BoundedFloat get_foo() const = 0;}; 这用作记录的高级表示,当保存到光盘并通过线路传输时 ..
发布时间:2021-12-31 14:42:48 C/C++开发