我了解到std::nullptr_t这是空指针文字的类型,nullptr.
然后我做了一个小程序:
#include <iostream>
int main()
{
std::nullptr_t n1;
std::cout<<n1<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里nullptr_t是数据类型并且n1是可变的,我正在尝试打印变量的值.但是,编译器给出了一个错误:
prog.cpp: In function 'int main()':
prog.cpp:6:11: error: ambiguous overload for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'std::nullptr_t')
std::cout<<n1<<endl;
Run Code Online (Sandbox Code Playgroud)
为什么不std::nullptr_t 一起工作std::cout在C++?我错在哪里?
operator<<对于多个不同类型的指针,输出流有重载,但不是std::nullptr_t 1.这意味着编译器无法确定要调用哪个重载,因为任何接受指针的重载都同样好.(例如,它接受char const *C风格的字符串,并且还会void const *输出原始指针值.)
修复此问题的一个选项是定义自己的重载,强制使用void const *重载:
std::ostream & operator<<(std::ostream &s, std::nullptr_t) {
return s << static_cast<void *>(nullptr);
}
Run Code Online (Sandbox Code Playgroud)
或者让它做其他事情:
std::ostream & operator<<(std::ostream &s, std::nullptr_t) {
return s << "nullptr";
}
Run Code Online (Sandbox Code Playgroud)
笔记:
std::nullptr_t在C++ 17中有一个过载接受,所以如果你使用一致的C++ 17实现,这将不再是一个问题.endl需要std::资格 - 但'\n'无论如何你应该在这里使用.(std::endl当你需要刷新流时,这只是一个好主意.)