C++ Tutorial: Enhance Type Safety and Code Clarity with the nullptr Keyword
2011-12-30 10:58
573 查看
Introduction
The literal 0 has a unique position in C++ programming -- it automatically converts to almost every fundamental type, depending on the context:int x=0; double d=0; char * pstr=0; //null pointer int (A::*pmf)(int) =0; //null pointer to member bool flag=0; //Boolean false
Using 0 as a null pointer might lead to overload resolution bugs such as this:
void f(int); //#1 void f(char *);//#2 f(0); //which f is called?
The C++ programmer believes that #2 is called. However, the compiler interprets 0 in this context as an integer, never as a pointer, and selects #1 instead. Things get worse when the macro NULL is used. Recall that NULL in C++ programming is
merely a synonym for 0:
f(NULL); //calls f(int)!
C usually defines NULL as (void*)(0). Many compilers don't even issue a warning in this case. The bug is detected (if ever) only at crash-time.
In contemporary C++ programming, the only workaround is an explicit typecast expression that forces the compiler to select the desired function:
f((char *)0); //unambiguous but still a kludge
This workaround isn't ideal though. Often, programmers don't use an explicit cast expression because they're not aware of the problem. Additionally, the cast expression obfuscates the code and makes it less readable.
Using nullptr
The C++ standards committee has been aware of this problem for many years. However, a consensus about the right solution was reached only recently in the form of a new keyword that designated a null pointer value. nullptr is a C++0x reserved keyword designatingan
rvalueconstant of type
std::nullptr_t.
nullptr is implicitly converted to pointers and pointers to members. However, it's not convertible to bool or any of the numeric types of C++.
You can use nullptr as an initializer for all pointer types and in comparison expressions:
const char *pc=str.c_str(); if (pc!=nullptr) cout<<pc<<endl; int (A::*pmf)()=nullptr; //pointer to member function int A::*pmi=nullptr; //pointer to data member
Any attempt to use nullptr as a non-pointer type will cause a compilation error:
char* ps=nullptr; //OK char c=nullptr; //error, type mismatch int n=nullptr; //error, type mismatch
A Solution to a Thorny Problem
The use of nullptr eliminates the overload resolution problem:func(nullptr); //calls func (char*) func(0); //calls func(int)
You may explicitly instantiate objects of type std::nullptr_t, and use nullptr in sizeof expressions:
cout<< typeid(nullptr).name(); size_t sz= sizeof(nullptr);
Throwing nullptr_t objects from a try block is also allowed:
try { if(failure) throw nullptr; //OK } catch(std::nullptr_t) { cerr<<"terminating!"; }
Conclusion
Many programming languages have used a reserved keyword to designate a null pointer or a null reference for ages. The lack of a similar keyword in C++ programming has been a fertile source of bugs for many years. The addition of nullptr finally fixes a thislongstanding loophole in the type system of C++. Microsoft's Visual Studio 2010 already
supports this feature and so does GCC 4.6; other vendors will also implement this feature soon.
相关文章推荐
- Safe! Repel Attacks on Your Code with the Visual Studio 2005 Safe C and C++ Libraries
- [Angular] Bind async requests in your Angular template with the async pipe and the "as" keyword
- Mixing C and C++ Code in the Same Program
- Refactor: replace type code with class (c++)
- The web application created a ThreadLocal with key of type [null] (value [com.opensymphony.xwork2.inject.ContainerImpl$10@1807b9
- 【C++注意事项】5 Top-level const , The auto and decltype Type Specifier
- Python Programming with the Java(TM) Class Libraries: A Tutorial for Building Web and Enterprise App
- C++11/C++14 (四)THE NULLPTR AND STRONG TYPED ENUMERATIONS
- Thread-safety with the Java final keyword
- C++ Qt Game Tutorial 3 - Shooting With the Spacebar
- Thread-safety with the Java final keyword
- 读书摘要:C++ Standard Library, The: A Tutorial and Reference
- [TypeScript] Use the never type to avoid code with dead ends using TypeScript
- C++ AMP: Analyzing C++ AMP Code with the Concurrency Visualizer
- MS SQL错误:SQL Server failed with error code 0xc0000000 to spawn a thread to process a new login or connection. Check the SQL Server error log and the Windows event logs for information about possible related problems
- 【C++注意事项】5 Top-level const , The auto and decltype Type Specifier
- Your app, extension, and/or linked framework appears to contain code designed explicitly with the ca
- Jenkins 安装启动提示“iJob for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.”
- C++ Qt Game Tutorial 2 - Moving With the Arrow Keys
- Changing the type of a property with EF Code First