char [N]与char *

时间:2011-03-30 21:55:51

标签: c++ operator-overloading

有人能告诉我为什么以下代码存在编译错误?

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; }
};

4 个答案:

答案 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禁止这样做