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。
您的代码结果得到保证,[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)和!nullptr,nullptr将被转换为bool具有值false。
| 归档时间: |
|
| 查看次数: |
540 次 |
| 最近记录: |