将const const成员函数转换为非const

时间:2012-08-11 12:48:30

标签: c++ casting const

是否正在转换用C ++定义的成员函数指针的const?以下是有效代码吗?

struct T {
  void foo(int i) const { std::cout << i << std::endl;};
};

void (T::*f1)(int) const = &T::foo;
void (T::*f2)(int)       = reinterpret_cast<void (T::*)(int)>(f1);
T t;
(t.*f2)(1);

更新

我之所以需要这个,是因为我正在编写一个接受对象和指向该对象的成员函数指针的函数。我需要一个const对象的版本(只接受const函数)和一个普通的。由于我不想要重复的代码,我的想法是将实际代码放在非const版本中,并从const中调用它,抛弃任何consts。

5 个答案:

答案 0 :(得分:3)

编译器吃它。 但落后的演员阵容更有用。

再次但是 - 最好不要使用它,const_cast通常只是一个快速而肮脏的解决方案,只有在没有任何其他解决方案时才应用。

回答更新

如果我理解正确,你将使用一个对象和两个函数。第一个函数接受const对象和const成员函数,第二个 - 非const对象和非const成员函数。

根据给定的信息,您可以更改第二个函数以接受非const对象和const成员函数。并给它们一个非const对象及其const成员函数。

答案 1 :(得分:1)

是的,已定义,但如果函数真的是const,你可能不想要它,因为一些编译器优化(即返回值缓存)依赖于函数是const。

答案 2 :(得分:0)

我没有理由这样做:即使你可以,也会让它更具限制性。 假设你有一个Foo类:

class Foo {
  void f() const;
  void g();
}

一些代码片段:

Foo a;
const Foo b;

然后,您可以同时拨打a.f()a.g(),但不能b.g(),因为bconst。如您所见,在成员函数之后放置const会减少限制,而不是更多。

并且,通过reinterpret_cast这个指针,你将获得具有完全相同值的指针(由于reinterpret_cast的性质),如果你试图调用它,你将获得进入相同的T :: foo()

答案 3 :(得分:0)

你可以做到,但没有任何意义,只要你可以调用f2,你也可以调用f1。你应该以另一种方式施展。但是如果有什么东西,你应该投射对象,而不是函数。

void (T::*f1)(int) const = &T::foo;
void (T::*f2)(int)       = reinterpret_cast<void (T::*)(int)>(f1);
T t;
(t.*f2)(1); // compiles
(t.*f1)(1); // this compiles too!!

但如果你有

const T t;
(t.*f2)(1); // error t is const
(t.*f1)(1); // still compiles

答案 4 :(得分:0)

唯一解决歧义的是执行static_cast,这基本上是一种语言功能

#include <boost/typeof/typeof.hpp>
struct Test
{
    const int& foo();
    const int& foo() const;
};

int main()
{
    typedef const int&(Test::*non_const_ptr)();
    typedef const int&(Test::*const_ptr)()const;
    BOOST_TYPEOF(static_cast<non_const_ptr>(&Test::foo)) ss;
}