nullptr虚假吗?

Dav*_*son 15 c++ nullptr implicit-conversion c++11

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

Vla*_*cow 18

根据C ++ 17标准(5.13.7指针文字)

1指针文字是关键字nullptr。它是std :: nullptr_t类型的prvalue。[注意:std :: nullptr_t是一种既不是指针类型也不是成员指针类型的独特类型;相反,此类型的prvalue是空指针常量,并且可以转换为空指针值或空成员指针值。参见7.11和7.12。—尾注]

和(7个标准转化)

4某些语言构造要求将表达式转换为布尔值。在这样的上下文中出现的表达式e被称为在上下文中转换为bool,并且当且仅当声明bool t(e)时,它的格式才正确。对于某些发明的临时变量t(11.6),其格式正确

最后(7.14布尔转换)

1算术,无作用域枚举,指针或指针成员类型的prvalue可以转换为bool类型的prvalue。零值,空指针值或空成员指针值将转换为false;其他任何值都将转换为true。对于直接初始化(11.6),可以将类型std :: nullptr_t的prvalue转换为bool类型的prvalue。结果值为false。

那就是你可以写例如

bool b( nullptr );
Run Code Online (Sandbox Code Playgroud)

但您可能不会写(尽管某些编译器存在与此相关的错误)

bool b = nullptr;
Run Code Online (Sandbox Code Playgroud)

因此nullptr可以在上下文中转换为bool类型的对象,例如在类似if语句的选择语句中。

让我们考虑一下!if语句中的一元运算符

if ( !nullptr ) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

根据运算符的描述(8.5.2.1一元运算符)

9 逻辑否定运算符的操作数!在上下文中转换为bool(第7条);如果转换后的操作数为false,则其值为true;否则为false。结果的类型是布尔

因此nullptr在此表达式中不会转换为指针。它在上下文中直接转换为bool。


son*_*yao 5

您的代码结果得到保证,[dcl.init] /17.8

否则,如果初始化为直接初始化,则源类型为std?::?nullptr_­t,目标类型为bool,正在初始化的对象的初始值为false

这意味着,对于直接初始化,bool可以nullptr使用结果值从中初始化对象false。然后对于(bool)(nullptr)nullptr将其转换为bool带值false

nullptr用作的条件if或的操作数时operator!,它被视为上下文转换

如果声明bool t(e);格式正确,则执行隐式转换

这意味着,这两个if (nullptr)!nullptrnullptr将被转换为bool具有值false

  • 这是一个错误的答案。std :: nullptr_t是一种既不是指针类型也不是指针成员类型的独特类型。nullptr t是一个空指针常量,可以在上下文中转换为bool。 (2认同)