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
限定只适用于指针本身(作为类的成员),而不是对象