我了解到nullptr,除了可转换为任何指针类型(但不是任何整数类型)之外,还有自己的类型std::nullptr_t.因此可以接受一个方法重载std::nullptr_t.
究竟为什么需要这样的过载?
我正在重构一些NULL在很多地方使用的旧代码.问题是
盲目地更换所有
NULL实例是否安全nullptr?
我特别感兴趣的是,替换NULL by nullptr可能会导致一些运行时错误(编译时错误可以),但我想不出任何错误.如果没有,通过nullptr自动替换NULL是否安全(如果有的话,修复编译时错误).
如果之前已经提出过问题我很抱歉 - 我找不到它,如果你指出我的答案,我会删除它!
如果我写
int zero = 0;
void *p1 = (void *)0;
void *p2 = (void *)(int)0;
void *p3 = (void *)(0 /*no-op, but does it affect the next zero?*/, 0);
void *p4 = (void *)zero; // For reference, this is a pointer to address zero
void *p5 = 0; // For reference, this is a null pointer
void *p6 = NULL; // For reference, this is a null pointer
void *p7 = nullptr; // For reference, this is a null pointer …Run Code Online (Sandbox Code Playgroud) 如果是这样,为什么下面的代码会给我警告
注意:即使在定义类时声明析构函数也不会调用析构函数或特定于类的运算符delete
?
struct C;
int main()
{
C *c = nullptr;
delete c;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白为什么它会在一般情况下是不确定的行为,如果C有非平凡/虚析构函数,但不标准的保证/定义delete上nullptr始终是一个noop不管情况如何?
重申:我具体询问指向不完整类型的指针的情况nullptr!
以下代码打印nullptr而不是empty(godbolt 链接):
#include <iostream>
class empty { };
#if 1
void f(std::nullptr_t) {
std::cout << "nullptr\n";
}
#endif
void f(empty) {
std::cout << "empty\n";
}
int main() {
f({});
}
Run Code Online (Sandbox Code Playgroud)
禁用f(nullptr_t)变体会导致empty打印。当两个变体都可用时,C++ 使用什么规则来选择nullptr_t变体?empty
我无法从C++ 11标准中看出nullptr_t是否有默认构造函数.换句话说,以下是否有效?:
nullptr_t n;
Run Code Online (Sandbox Code Playgroud)
GCC和VC++允许上面的代码,但clang没有.我在标准中找不到任何指定它没有默认构造函数的东西,我能找到它表明它应该.这对我很重要,因为我正在为较旧的编译器支持编写nullptr的基本回退实现,并且需要知道是否需要为其提供默认构造函数.
总结:nullptr转换为bool,bool转换为int,为什么不nullptr转换为int?
这段代码没问题:
void f(bool);
f(nullptr); // fine, nullptr converts to bool
Run Code Online (Sandbox Code Playgroud)
这没关系:
bool b;
int i(b); // fine, bool converts to int
Run Code Online (Sandbox Code Playgroud)
那么为什么这不行呢?
void f(int);
f(nullptr); // why not convert nullptr to bool, then bool to int?
Run Code Online (Sandbox Code Playgroud) 我想知道以下代码是否导致未定义的行为:
#include <cstddef>
#include <cstdio>
struct IA {
virtual ~IA() {}
int a = 0;
};
struct IB {
virtual ~IB() {}
int b = 0;
};
struct C: IA, IB {};
int main() {
C* pc = nullptr;
IB* pib = pc;
std::printf("%p %p", (void*)pc, (void*)pib);
}
Run Code Online (Sandbox Code Playgroud) 当用作布尔表达式或显式或隐式转换为布尔值时,是否nullptr始终为假?该实现是否在标准中定义或指定?
我编写了一些代码进行测试,但不确定是否可以完全测试此属性。我找不到一个专门讨论此问题的现有SO答案。从我所见,cppreference并没有提到这一点。
if (nullptr) {
;
} else {
std::cout << "Evaluates to false implicitly\n";
}
if (!nullptr) {
std::cout << "Evaluates to false if operated on\n";
}
if (!(bool)(nullptr)) {
std::cout << "Evaluates to false if explicitly cast to bool\n";
}
Run Code Online (Sandbox Code Playgroud)
预期和实际:
Evaluates to false implicitly
Evaluates to false if operated on
Evaluates to false if explicitly cast to bool
Run Code Online (Sandbox Code Playgroud)