4

在 C++ 中,编译以下代码:

std::pair <int, int>  x;
static_cast <std::pair <const int, int>*> (&x);

给出一个错误:

error: invalid static_cast from type ‘std::pair<int, int>*’ to type ‘std::pair<const int, int>*’

我或多或少理解它为什么会发生,因为 cv 限定模板参数列表中的类型原则上可以给出“不兼容”的结果。即使在这种情况下它没有,编译器也无法知道它。

无论如何,有没有一种非黑客的方式来执行这种转换?我对使用reinterpret_cast任何东西都持谨慎态度,因为我以前遇到过类型双关问题。另外,我不能使用临时变量,因为这是对性能至关重要的代码。

编辑:

这就是我正在做的事情。我正在实现一个与std::unordered_map. 因此,它value_type需要是一个pair <const key_type, mapped_type>. 为了进行一些优化,我需要在内部将值存储为pair <key_type, mapped_type>,而没有const. 但是,如果我这样做,我不能(没有reinterpret_cast)在容器上实现迭代器,因为它们需要返回对值的引用,而我只有对这些非常量对的引用。

4

2 回答 2

1

这不是演员表,但您可以执行以下操作:

std::pair<int, int>  x;
std::pair<const int, int> y( x );

这应该根据 §20.2.2/4 工作。

于 2010-09-03T18:36:12.447 回答
0

这个怎么样:

template< typename T1, typename T2 >
struct ref_pair {
public:
    typedef const T1 first_type;
    typedef T2 second_type;

    ref_pair(first_type& f, second_type& s) : f_(f), s_(s) {}

    first_type& first() {return *f_;}
    second_type& second() {return *s_;}
private:
    first_type* f_;
    second_type* s_;
};

我知道,它是不同的,那些是功能。如果你真的很绝望,你可以把firstsecond变成一些代理类型的对象,延迟评估*f_*s_.
然而,最终总有一种方法可以让用户分辨出来。


我认为以下内容将是相当安全和便携的,尽管当然,reinterpret_cast没有任何保证:

std:::pair<const int,int>& rx = reinterpret_cast<std:::pair<const int,int>&>(x);

不过感觉很脏。我现在要洗手了。

于 2010-09-03T19:43:49.587 回答