【发布时间】:2021-10-27 07:56:58
【问题描述】:
代码 1
#include <iostream>
int main()
{
std::cout << nullptr;
return 0;
}
输出
Error: Use of overloaded operator '<<' is ambiguous (with operand types 'std::ostream' (aka 'basic_ostream<char>') and 'nullptr_t')
即使nullptr 有特定类型,为什么它会显示错误。
但是
代码 2
#include <iostream>
int main()
{
std::cout << (void*)nullptr;
return 0;
}
输出
0
工作正常。为什么它与void* 一起工作,即使它不是一个类型?
【问题讨论】:
-
void* even it is not a typevoid*是一种类型。类型为void*。 -
一般来说,如果您需要进行 C 风格的转换(如
(void*) nullptr),您可能做错了什么。最好改用reinterpret_cast,最好是完全不用演员表(如果可能的话)。 -
我在 Visual Studio 2019 中看到您引用的“错误”作为 IntelliSense 消息(有时),但我使用 MSVC 或 clang-cl 没有收到编译器错误或警告。你用的是哪个编译器?
-
@AdrianMole
basic_ostream& operator<<( std::nullptr_t )在 C++17 中引入。这在早期版本中是模棱两可的。 -
@AdrianMole
jetbrains CLionC++17,20,23。对于codechef上的C++17是的,它没有给出错误?但我认为CLion是高级编译器
标签: c++ c++17 void-pointers nullptr