有人能告诉我为什么以下代码存在编译错误?
struct Foo {
char m_p[8];
inline operator char *() const { return m_p; }
};
通过GCC 4.5,我收到了消息:
错误:来自'const的无效转换 char *'to'char *'
虽然Digital Mars编译器没有问题。
编辑:下面列出的答案提到了函数的const限定符。我真正没有得到的是为什么以下代码没有这样的问题:
struct Foo2 {
char *m_p;
inline operator char *() const { return m_p; }
};
答案 0 :(得分:6)
由于该运算符是const
函数,this
及其所有成员(m_p
)应该是const。因此m_p
的类型为const char[8]
。它不能隐式转换为char*
,因为const
- 将会丢失。转换为const char*
即可。
您可以让它返回const char*
inline operator const char *() const { return m_p; }
或删除const
限定符
inline operator char *() { return m_p; }
或提供两种方法。
数字火星在这里是错误的。或者您可能需要启用一些警告。
答案 1 :(得分:1)
因为在函数内(通过const限定),数组的类型为const char[8]
,并且无法转换为char*
,只有const char*
。
要么抛弃函数的const限定,要么将其添加到返回类型。此外,inline
在这里是冗余的,因为在类定义中定义的成员无论如何都是隐式inline
。
答案 2 :(得分:1)
char m_p [8]和char * m_p之间的区别在于前者是对象的一部分,当从const限定方法访问时,它将变为const。对于它指向其他地方的指针,您可以从const限定方法返回它,而不必强制它为const。
答案 3 :(得分:0)
您的运营商已标记为const
,因此它会获得const
this
指针。这意味着您尝试通过struct
指针访问this
的任何字段实际上都是const
(因为它是通过const
- 路径访问的),所以,当return m_p;
m_p
衰减到const char *
时,char *
无法转换为const
(运算符的返回类型),因为放弃了{{1}修饰符需要const_cast
。
长话短说:如果您希望该运算符为const
,则返回类型必须为const char *
,否则您将遇到const
方法(=> ;可以在const
对象上调用)可以让调用者修改对象(通过返回的非const
指针),即使const
禁止这样做