【问题标题】:`cout<<nullptr` giving error though `nullptr` has type `nullptr_t` from C++17尽管 `nullptr` 具有 C++17 中的`nullptr_t` 类型,`cout<<nullptr` 却给出错误
【发布时间】: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 type void* 是一种类型。类型为void*
  • 一般来说,如果您需要进行 C 风格的转换(如 (void*) nullptr),您可能做错了什么。最好改用reinterpret_cast,最好是完全不用演员表(如果可能的话)。
  • 我在 Visual Studio 2019 中看到您引用的“错误”作为 IntelliSense 消息(有时),但我使用 MSVC 或 clang-cl 没有收到编译器错误或警告。你用的是哪个编译器?
  • @AdrianMole basic_ostream&amp; operator&lt;&lt;( std::nullptr_t ) 在 C++17 中引入。这在早期版本中是模棱两可的。
  • @AdrianMole jetbrains CLion C++17,20,23 。对于codechef 上的C++17 是的,它没有给出错误?但我认为CLion 是高级编译器

标签: c++ c++17 void-pointers nullptr


【解决方案1】:

std::cout &lt;&lt; nullptr; 在 C++17 中工作。如果它不适合你,那么要么你没有使用 C++17,要么你的语言实现对 C++17 的支持不完整。

在 C++17 之前,std::cout &lt;&lt; nullptr; 不起作用,因为重载 std::ostream::operator&lt;&lt;(std::nullptr_t) 不存在,并且不存在 nullptr 可以隐式转换为的明确最佳重载。

为什么即使它不是类型,它也可以与 void* 一起使用?

void* 是一种类型,它在重载std::ostream::operator&lt;&lt;(const void*); 存在的情况下工作。

【讨论】:

  • @AbhishekMane 如果您喜欢,任何 IDE 都可以。我对自己缺乏免费的社区版本感到失望,但如果他们没有它就获得足够多的付费客户,那么我想人们会喜欢它。
  • 看起来这是从 GCC 9 开始在 libstdc++ 中实现的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2013-06-08
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多