我想知道为什么有两种指定空指针的方式。我看了这个链接,但并没有很清楚地理解它的用途。
有人可以给一个好的例子什么时候使用什么吗?
自2005年起,C++/CLI语言已经拥有了nullptr
关键字。 当C++11采用nullptr关键字用于C++时,这就导致了问题。现在有两个关键字,一个用于托管代码,另一个用于本机代码。 C++/CLI编译器可以编译两者。因此,当您指的是本机空指针时,必须使用__nullptr,而当您指的是托管空指针时,请使用nullptr。
只有在启用/clr编译选项时才相关。 换句话说,以C++/CLI代码编写。 在C++代码中只需使用普通的nullptr即可。
这个案例中,微软写了一个很好的解释(https://learn.microsoft.com/en-us/cpp/extensions/nullptr-cpp-component-extensions?view=msvc-170)- 和这个帖子中所接受的答案完全一致:“在本机代码中使用nullptr,在C++/CLI中对管理对象使用nullptr,在本机指针中使用__nullptr”。
然而,在同一篇文章中,微软展示了一些例子,完全忽略了这个建议:
// mcpp_nullptr.cpp
// compile with: /clr
value class V {};
ref class G {};
void f(System::Object ^) {}
int main() {
// Native pointer.
int *pN = nullptr;
// Managed handle.
G ^pG = nullptr;
实际上,您可以将nullptr用于托管和本机指针。在这种情况下,编译器不会生成错误或警告。代码也能正常运行。只有当您想要明确地在代码中表达“嘿,这是一个本机指针,看,这很重要!”时,您才可以使用__nullptr。因此,这更多地展示了nullptr的含义给其他程序员,而不是关于编译器的代码正确性。
nullptr
,在使用非托管指针时使用__nullptr
。然而,由于nullptr
可用于托管和非托管指针,个人认为没有理由使用__nullptr
。nullptr
还是C++/CLI的nullptr
?它无法知道,这就是为什么在使用/clr开关进行编译时,当您指的是C++11版本时,必须使用__nullptr
的原因。 - Michael Price
nullptr
。 - Michael Price