- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试针对空值进行赋值和测试的编译时检查。原因是我正在使用一个“魔法”非空指针来表示某物的脱离状态,而且很容易忘记它正在使用那个魔法指针并错误地分配和测试 nullptr。 (特别是因为那是代码历史上一直使用的内容。)
认为这是人们已经解决的问题,我搜索并发现 not_null
为 part of the C++ Core Guidelines ,这听起来很有希望。这是 Microsoft 的 MIT 许可实现:
但它只停止对 nullptr 的赋值,而不是比较:
#include <iostream>
#include "include/gsl/gsl"
int main() {
int i;
gsl::not_null<int*> ptr (&i);
/* gsl::not_null<int*> ptr_error (nullptr); */ // this errors
if (ptr != nullptr)
std::cout << "No compile error on compare--this prints\n";
}
那是……不幸的。 :-/
核心指南的目的不是帮助程序员对程序的语义进行编码吗?是否有人针对 null 测试指针并据此做出决策表明他们不知道自己在做什么,并且源代码很可能有错误?
对 not_null
进行哪些细微修改以将其更改为不允许进行这些比较,例如nullptr == ptr
、ptr == nullptr
等等?蛮力我只是 = delete;
一些重载到 == 和 != 直到它在我想要的情况下给出错误,但我希望使用预先编写的代码是有人会想到并且更普遍地做到了“正确”。
最佳答案
你可以这样做的原因之一可能是因为有时你可能会得到一个指针/智能指针并想将它与 gsl::not_null
进行比较和/或传递 gsl模板函数中的::not_null
(绝对不知道 gsl::not_null
提供什么):
template<class Lhs, class Rhs>
bool hasSameValue(Lhs lhs, Rhs rhs){
if(lhs == nullptr || rhs == nullptr)
return lhs == rhs;
return *lhs == *rhs;
}
gsl::not_null<int*> ptr = /* [...] */;
shared_ptr<int> sptr = /* [...] */;
hasSameValue(ptr, sptr);
如果您仍想禁止使用 nullptr
进行检查:
bool operator==(std::nullptr_t nptr) = delete;
bool operator!=(std::nullptr_t nptr) = delete;
将它们标记为已删除就足够了。请注意,gsl::not_null
不能继承自定义它们的类才能这样做。如果它继承自一个定义它们的类,只需抛出一个异常(即使它只是一个运行时错误)。
关于c++ - 修改 not_null 以禁止与 nullptr 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51057099/
我继承了一些代码,其中以前的编码器写了这样的代码: if (!not_null($page)) { die('Error!Unable to determine the page
使用 JsonInclude(content=Include.NON_NULL) (或实际上任何其他 JsonInclude 选项)似乎对我的对象的序列化没有影响。考虑这个测试: public cla
这是一个人为的例子,但请考虑以下内容: #include #include "gsl.h" int main(){ //object or array that I'd like to iter
添加评论后"// not null"第 N 次指向原始指针 我再次想知道 not_null 发生了什么模板。 C++ core guidelines是很久以前创建的,并且一些内容已纳入标准,例如 st
我正在尝试针对空值进行赋值和测试的编译时检查。原因是我正在使用一个“魔法”非空指针来表示某物的脱离状态,而且很容易忘记它正在使用那个魔法指针并错误地分配和测试 nullptr。 (特别是因为那是代码历
Guidelines Support Library介绍not_null谁的目的是在类似指针的类型上强制执行不变量,有意地在智能指针上。然而it's a known issue那not_null>不起
我习惯于使用 __attribute__((nonnull))表达不应为空的指针时。 void f(int* ptr) __attribute__((nonnull)); int main(){
在微软implementation指南支持库我看到以下代码: template class not_null { ... template ::value>> constexp
C++ Core Guidelines最近提出了(恭喜!),我很担心gsl::not_null类型。如 I.12: Declare a pointer that must not be null as
我是一名优秀的程序员,十分优秀!