无法使用“const char [X]”类型的左值初始化“const signed char *”类型的成员子对象

Posted

技术标签:

【中文标题】无法使用“const char [X]”类型的左值初始化“const signed char *”类型的成员子对象【英文标题】:Cannot initialize a member subobject of type 'const signed char *' with an lvalue of type 'const char [X]' 【发布时间】:2017-10-11 10:13:39 【问题描述】:

我有以下代码:

typedef       signed char         Char;

static const struct MyStruct

    const Char* str;
    // Other fields

myList[] =

    "none", /* Other fields */,
    "main", /* Other fields */,

但我有编译错误:

无法使用“const char [X]”类型的左值初始化“const Char *”类型的成员子对象(又名“const signed char *”)

X 是字符串长度

当我将Char 替换为char 时没问题,但是如何使用signed char

【问题讨论】:

【参考方案1】:

"none",例如是const char[5] 类型。在某些情况下,这可能衰减const char*

无论在您的平台上charsigned 还是unsignedcharsigned charunsigned char 都是始终不同的类型。

C++ 不允许将const char[N] 类型直接衰减为const char* 以外的任何类型(或指向const char*typedef 的指针),因此在您的情况下,需要发出诊断。

在 C++ 中,您有很多其他选择:std::string 是您的明显选择。

要检查您拥有的char 的类型,请使用

std::numeric_limits<char>::is_signed

来自&lt;limits&gt;

【讨论】:

感谢您的快速回答。我怎么知道 char 是有符号还是无符号? @A.Pissicat:最后搞砸了。【参考方案2】:

但是我怎样才能使用有符号字符呢?

通过使用signed char 的数组而不是字符串文字:

signed char none[] = 'n','o','n','e','\0';

...

myList[] =

    none, /* Other fields */,
    ...

请注意,char(字符文字的类型)可能是无符号的,如果 signed char 无法表示该值,则结果值将由实现定义。

【讨论】:

以上是关于无法使用“const char [X]”类型的左值初始化“const signed char *”类型的成员子对象的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 double 类型的左值初始化“id _NonNull”类型的参数

错误:无法使用“const char [34]”类型的左值初始化“const char”类型的返回对象

错误:无法使用“int [r][c]”类型的左值初始化“int *”类型的返回对象

函数类型的左值是不是是可修改的左值?

绑定 T&& 类型的左值表达式

c++的左值(lvalue),右值(rvalue),移动语义(move),完美转发(forward)