C++ char[N]与char*

C++ char[N]与char*,c++,operator-overloading,C++,Operator Overloading,有人能告诉我为什么下面的代码有编译错误吗 struct Foo { char m_p[8]; inline operator char *() const { return m_p; } }; 根据GCC 4.5,我得到的信息是: 错误:“常量”的转换无效 字符*'到字符*' 而数字火星编译器没有问题 编辑:下面列出的答案提到函数上的常量限定符。我真正不明白的是为什么下面的代码没有这样的问题: struct Foo2 { char *m_p; inline operator c

有人能告诉我为什么下面的代码有编译错误吗

struct Foo {
  char m_p[8];
  inline operator char *() const { return m_p; }
};
根据GCC 4.5,我得到的信息是:

错误:“常量”的转换无效 字符*'到字符*'

而数字火星编译器没有问题

编辑:下面列出的答案提到函数上的常量限定符。我真正不明白的是为什么下面的代码没有这样的问题:

struct Foo2 {
  char *m_p;
  inline operator char *() const { return m_p; }
};

因为在函数中(常量限定),数组的类型是
const char[8]
,不能转换为
char*
,只能转换为
const char*


要么放弃函数上的常量限定,要么将其添加到返回类型中。另外,
inline
在这里是多余的,因为在类定义中定义的成员都是隐式的
inline

因为在函数(const限定)中,数组的类型是
const char[8]
,并且不能转换为
char*
,只有
const char*


要么放弃函数上的常量限定,要么将其添加到返回类型中。另外,
inline
在这里是多余的,因为在类定义中定义的成员都是隐式的
inline

因为该操作符是一个
const
函数,
this
及其所有成员(
mup
)都应该是const。因此
m_p
的类型是
const char[8]
。它不能隐式转换为
char*
,因为
常量将丢失。转换为常量字符*
是可以的

您可以让它返回一个
const char*

 inline operator const char *() const { return m_p; }
或删除
const
限定符

 inline operator char *() { return m_p; }
或者提供两种方法


数字火星在这里是错误的。或者您可能需要启用一些警告。

由于该运算符是一个
常量
函数,
及其所有成员(
m_p
)都应该是常量。因此
m_p
的类型是
const char[8]
。它不能隐式转换为
char*
,因为
常量将丢失。转换为常量字符*
是可以的

您可以让它返回一个
const char*

 inline operator const char *() const { return m_p; }
或删除
const
限定符

 inline operator char *() { return m_p; }
或者提供两种方法


数字火星在这里是错误的。或者您可能需要启用一些警告。

您的运算符被标记为
const
,因此它将获得一个
const
指针。这意味着,无论您试图通过
这个
指针访问
结构的哪个字段,它实际上都是
常量
(因为它是通过
常量
-路径访问的),因此当您执行
操作时,返回m\p
m\u p
衰减为
const char*
,而这又不能转换为
char*
(运算符的返回类型),因为删除
const
修饰符需要
const\u cast


长话短说:如果您希望该操作符是
const
,那么返回类型必须是
const char*
,否则您会遇到这样的情况,即
const
方法(>可以在
const
对象上调用)将允许调用方修改对象(通过返回的非
const
指针)即使这应该被
const
禁止,您的操作符也会被标记为
const
,因此它会得到一个
const
指针。这意味着,无论您试图通过
这个
指针访问
结构的哪个字段,它实际上都是
常量
(因为它是通过
常量
-路径访问的),因此当您执行
操作时,返回m\p
m\u p
衰减为
const char*
,而这又不能转换为
char*
(运算符的返回类型),因为删除
const
修饰符需要
const\u cast


长话短说:如果您希望该操作符是
const
,那么返回类型必须是
const char*
,否则您会遇到这样的情况,即
const
方法(>可以在
const
对象上调用)将允许调用方修改对象(通过返回的非
const
指针)即使这应该被const禁止,char m_p[8]和char*m_p之间的区别在于前者是对象的一部分,当从const限定方法访问时,它将变为const。对于指针,它指向其他地方,您可以从const限定方法返回它,而无需强制它为const。

char m_p[8]和char*m_p之间的区别在于前者是对象的一部分,从const限定方法访问时,它将变为const。对于指针,它指向其他地方,您可以从const-qualified方法返回它,而不必强制它为const。

这看起来很好。我认为这里的上下文很重要,你从编译器那里得到的错误信息是不言自明的。您有一个
const char[8]
数组,它可以转换为
const char*
指针,但不能转换为
char*
指针。这看起来很好。我认为这里的上下文很重要,你从编译器那里得到的错误信息是不言自明的。您有一个
const char[8]
数组,它可以转换为
const char*
指针,但不能转换为
char*
指针。谢谢KennyTM。我还不明白为什么一个
char*
而不是
char[N]
不会出现错误,即使转换运算符上有
const
。当您将其更改为指针时,成员函数上的
const
限定只适用于指针本身(作为类的成员),而不是对象