我想使用以下代码定义一些通用指针(?但不是空指针):
class A
{
template<typename T>
using ptr = T*;
using ubyte = uint8_t;
public:
const ptr<ubyte>
getColor1() const {
return &colors[0];
}
const ubyte*
getColor2() const {
return &colors[0];
}
private:
ubyte colors[4];
};
但是,getColor1()
将无法编译。
这两个功能有什么区别?
gcc说:
error: invalid conversion from 'const ubyte* {aka const unsigned char*}' to 'A::ptr<unsigned char> {aka unsigned char*}' [-fpermissive]|
更新
删除的答案说我可以这样做:
//option 1
template<typename T>
using const_ptr = const T*;
或
//option 2
const ptr<ubyte>
getColor() //remove cv-qualifier
{
return &colors[0];
}
来自option1,
现在构建到const const
,const const
意味着什么?
来自option2,
为什么只删除cv-qualifier会使这个编译?
答案 0 :(得分:4)
const ptr<ubyte>
与const (ubyte *)
相同, 与const ubyte (*)
相同。您正在尝试将const
指针返回到非const char
,编译器将不允许这样,因为您已声明函数本身const
;因此,所有成员都成为const
。如果没有const_cast
,编译器不会自动将const转换为非const。
为了使差异更清楚,第一个是指向非const char
的const指针,第二个是指向const char
的非const指针。第一个允许指向字符改变,即使指针本身不能改变。由于该函数被标记为const
,因此无法返回任何允许其成员被修改的内容。
解决问题的最佳方法:
ptr<const ubyte>
getColor1() const {
return &colors[0];
}
答案 1 :(得分:1)
由于ptr
模板的语法,const ptr<ubyte>
首先使其成为ubyte*
,然后应用const,从而产生ubyte * const
,一个指向UBYTE。
为了返回指向const ubyte的指针,您需要将const ubyte
提供给指针模板,因此首先应用constness:
ptr<const ubyte>
答案 2 :(得分:1)
1)“const const意味着什么?”
const T* const pT = new T;
表示const指针pT - 您不能将pT指定给另一个对象; 到类型为T的const对象 - 你不能改变pT指向的对象。
2)“为什么只删除cv-qualifier会使这个编译?”
getColor1()
没有const modifier的方法可以修改对象。它现在返回A :: ubyte *,它可以转换为const类型,例如声明为返回类型:A :: ubyte * const(const ptr&lt; ubyte&gt;)