GCC上实现nullptr的疑问C/C++ code#include iostreamusing namespace stdconst class nullptr_t{public
GCC上实现nullptr的疑问
- C/C++ code
#include <iostream>using namespace std;const class nullptr_t{public: template<typename T> operator T*() const { return (T*)0; } template<typename C, typename T> operator T C::*() const { return (T*)0; }private: void operator&() const;} nullptr = {};int main(){ int* p1 = nullptr;// cout << &nullptr << endl; // error: 'void nullptr_t::operator&() const' is private return 0;}疑问一:这个操作符重载对应什么例子?
- C/C++ code
template<typename C, typename T> operator T C::*() const { return (T*)0; }疑问二:是否还有更好的写法?
[解决办法]
一、实际使用例子:
- C/C++ code
class B {public: B(int a) {a_ = a;} int a_;};int main(){ int* p1 = nullptr; B b(5); int B::* a = nullptr; a = &B::a_; return 0;}
[解决办法]
[解决办法]
呵呵,这个实现挺不错的。
解答一:
这个操作符重载是对应于指向成员的指针,比如:
- C/C++ code
class Test{public: int a; void method(void){}};int Test::*p = &Test::a;void (Test::*pm)(void) = &Test::method;int main(){ int* p1 = nullptr; p = nullptr; pm = nullptr; return 0;}
[解决办法]
[解决办法]
[解决办法]
惊现神人老邓问问题!
[解决办法]
同意,我也认为define不好,就是怕类型不安全的问题嘛!
[解决办法]
nullptr这样定义会不会更好一点
- C/C++ code
const int nullptr = 0;
[解决办法]
nullptr解决的问题:
例如有两个重载函数
int foo(const char*a);
int foo(int a);
如果有代码foo(NULL),按照期望是应该调用第一个函数的,但是由于在C++中NULL被定义成0,所以实际调用的是第二个,这与我们的直觉不同。nullptr不能直接转换成int,所以如果使用foo(nullptr),调用到的将是"正确"的函数
[解决办法]
没仔细看代码。印象中《Imperfect C++》里面有一章是讲这个的。但是这东西尽管有用,却是用复杂的方式解决简单的问题,个人是不喜欢这类东西。
[解决办法]
[解决办法]
nullptr 就算要实现,也应该是编译器内部实现,这样才有一点用处
这么模拟出来东西,越搞越糊涂,本来为了解决一个很小很偏的问题,反而引入更多的问题,得不偿失.
[解决办法]
[解决办法]
[解决办法]
[解决办法]
[解决办法]
实现nullptr需要看很多书。
使用nullptr往往是一个错误,代码已经太复杂,太胡乱了。除非你在做一个通用库。
[解决办法]
[解决办法]
nullptr的实现不是应该解决调用成员函数/变量时的问题吗?
比如:
MyClass *obj = nullptr;
obj.fun(); //使这样的语句在运行时不会出错。
lz的这个实现和直接用NULL这个宏没多少区别吧。
[解决办法]
