C ++在类的const方法中将char数组赋值给T *的方法

时间:2015-02-02 21:54:28

标签: c++ casting

我想在堆栈上使用一些内存来存储一些对象(它出现在一个小的矢量优化库中)。因此,我的班级是

template <typename T, int n>
class SmallVector {
private:
    T* begin_;
    T* end_;
    T* capacity_;
    alignas(T) char data_small_[n * sizeof(T)];
public:
    ...
}

为了检查是否使用了small_data_缓冲区,我定义了函数

bool is_data_small_used() const {
    return begin_ == reinterpret_cast<T*>(data_small_);
}

不幸的是,它不起作用。铿锵版

Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix

给我以下错误消息:

./il/container/SmallVector.h:44:25: error: reinterpret_cast from 'const char *' to 'il::Vector<double> *' casts away qualifiers
        return begin_ == reinterpret_cast<T*>(data_small_);

和英特尔编译器说的相同。我找到的唯一解决方案是

begin_ == (T*) data_small_

这不是很C ++。在C ++中有没有“正确的方法”?

1 个答案:

答案 0 :(得分:2)

错误消息表明问题发生在const成员函数中。在这种情况下,this被视为指向const对象,因此data_small_将具有类型const char[N]

一个简单的解决方法是写:

return begin_ == reinterpret_cast<T const *>(data_small_); 

另一个是:

return reinterpret_cast<char const *>(begin_) == data_small_;

C风格的演员之所以有效,是因为该演员阵容可以同时进行reinterpret_castconst_cast,而reinterpret_cast本身无法抛弃const