标签: nullptr

`std :: nullptr_t`类型的用途是什么?

我了解到nullptr,除了可转换为任何指针类型(但不是任何整数类型)之外,还有自己的类型std::nullptr_t.因此可以接受一个方法重载std::nullptr_t.

究竟为什么需要这样的过载?

c++ nullptr c++11

19
推荐指数
2
解决办法
4951
查看次数

当NULL不能被nullptr替换时?

我正在重构一些NULL在很多地方使用的旧代码.问题是

盲目地更换所有NULL实例是否安全nullptr

我特别感兴趣的是,替换NULL by nullptr可能会导致一些运行时错误(编译时错误可以),但我想不出任何错误.如果没有,通过nullptr自动替换NULL是否安全(如果有的话,修复编译时错误).

如果之前已经提出过问题我很抱歉 - 我找不到它,如果你指出我的答案,我会删除它!

c++ null nullptr c++11

19
推荐指数
1
解决办法
1790
查看次数

这些空指针,还是地址为0的指针?

如果我写

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)

c c++ null nullptr language-lawyer

18
推荐指数
3
解决办法
888
查看次数

在不完整类型的空指针上调用delete是否合法?

如果是这样,为什么下面的代码会给我警告

注意:即使在定义类时声明析构函数也不会调用析构函数或特定于类的运算符delete

struct C;

int main()
{
    C *c = nullptr;

    delete c;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

明白为什么它在一般情况下是不确定的行为,如果C有非平凡/虚析构函数,但不标准的保证/定义deletenullptr始终是一个noop不管情况如何?

重申:我具体询问指向不完整类型的指针的情况nullptr!

c++ nullptr language-lawyer delete-operator incomplete-type

18
推荐指数
1
解决办法
1755
查看次数

为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

以下代码打印nullptr而不是emptygodbolt 链接):

#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++ gcc clang nullptr overload-resolution

17
推荐指数
1
解决办法
987
查看次数

nullptr_t是默认的可构造类型吗?

我无法从C++ 11标准中看出nullptr_t是否有默认构造函数.换句话说,以下是否有效?:

nullptr_t n; 
Run Code Online (Sandbox Code Playgroud)

GCC和VC++允许上面的代码,但clang没有.我在标准中找不到任何指定它没有默认构造函数的东西,我能找到它表明它应该.这对我很重要,因为我正在为较旧的编译器支持编写nullptr的基本回退实现,并且需要知道是否需要为其提供默认构造函数.

c++ gcc clang nullptr

16
推荐指数
1
解决办法
2736
查看次数

为什么nullptr不能转换为int?

总结: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)

c++ nullptr implicit-conversion c++11

16
推荐指数
2
解决办法
6432
查看次数

c ++是否需要在用户定义的和特定于类的删除操作符中处理nullptr.

用户定义和类特定的删除操作符是否需要忽略nullptr,因为标准库中的操作符会这样做?


谷歌小组的平行讨论.

c++ nullptr language-lawyer delete-operator

16
推荐指数
2
解决办法
369
查看次数

向上转换空指针会导致未定义的行为

我想知道以下代码是否导致未定义的行为:

#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)

c++ upcasting nullptr language-lawyer implicit-conversion

15
推荐指数
2
解决办法
175
查看次数

nullptr虚假吗?

当用作布尔表达式或显式或隐式转换为布尔值时,是否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)

c++ nullptr implicit-conversion c++11

15
推荐指数
2
解决办法
540
查看次数