当用作布尔表达式或显式或隐式转换为布尔值时,是否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) 我有以下代码:
template <typename T>
struct wrapper {
T t;
operator T() { return t; }
T get() { return t; }
};
int main() {
int a[10];
int* x = a;
wrapper<long unsigned int> y{2};
std::cout << (x + y); // warning
}
Run Code Online (Sandbox Code Playgroud)
当我在 gcc 上编译它(在 7.3.0 和 8.2.0 上测试)时,-Wsign-conversion我收到“警告:从‘long unsigned int’转换为‘long int’可能会改变结果的符号”。如果y有 type long unsigned int,则没有警告。此外,当我明确调用时y.get()也没有警告:
std::cout << (x + y.get()); // this is ok
Run Code Online (Sandbox Code Playgroud)
为什么会出现这种情况呢?使用用户定义的转换时,是否有一些不能使用的指针算术特殊规则?