lee*_*mes 5 c++ member-function-pointers smart-pointers operator-overloading c++11
在处理类成员函数指针时,我们可以使用以下语法在对象实例上调用函数:
struct X {
void foo();
};
X x; // Instance
auto f = &X::foo; // Member function pointer
(x.*f)(); // Call function f on x
Run Code Online (Sandbox Code Playgroud)
当有一个实例的原始指针时,语法是这样的:
X *xptr = new X();
(xptr->*f)();
Run Code Online (Sandbox Code Playgroud)
这很好地遵循了静态函数调用的类比:
x.foo();
x->foo();
Run Code Online (Sandbox Code Playgroud)
但是,当我有一个类的智能指针时,这不起作用:
unique_ptr<X> xsptr(new X());
(xsptr->*f)(); // g++: error: no match for 'operator->*' in 'xsptr ->* f'
Run Code Online (Sandbox Code Playgroud)
我通过首先应用取消引用运算符,然后使用以下.语法调用来解决此问题:
((*xsptr).*f)();
Run Code Online (Sandbox Code Playgroud)
这是有多丑?
编译器是否应该拒绝上面的箭头语法?因为通常(静态调用函数时),它调用operator ->. 不应该->*也只是打电话operator ->吗?
编译器错误部分地回答了这个问题:错误读作我们可以重载operator ->*以调用解除引用对象上的成员函数指针,但unique_ptr事实并非如此。但这带来了更多的问题。如果语言需要这样做,为什么智能指针不这样做?是不是打算不这样做,因为它引入了其他问题?为什么我们必须写这个操作符,而不是隐式调用返回的对象上的成员函数指针->?(因为这是写作时的行为xsptr->foo())
编译器是否应该拒绝上面的箭头语法?因为通常(静态调用函数时),它调用运算符 ->。->* 不应该只调用运算符 -> 吗?
编译器拒绝该语法是正确的。否operator->*不应调用operator->(根据标准)。请注意,虽然语法可能看起来相似,但它本身就是一个运算符,而不是与其他东西->*的组合。->*
| 归档时间: |
|
| 查看次数: |
2825 次 |
| 最近记录: |