我想在堆栈上使用一些内存来存储一些对象(它出现在一个小的矢量优化库中)。因此,我的班级是
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 ++中有没有“正确的方法”?
答案 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_cast
和const_cast
,而reinterpret_cast
本身无法抛弃const
。