为什么编译器不抱怨将char添加到char*?

Sou*_*tta 2 c++ char-pointer

为什么c ++编译器不会抱怨以下代码?

#include<iostream>
int main()
{
    const char* p ="Hello";
    std::string q = p + 'H';
    std::cout << q << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它正确地抛出了以下代码的错误

#include<iostream>
int main()
{
    const char* p ="Hello";
    std::string q = p + "World";
    std::cout << q << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

编译器抛出的错误语句

test.cxx: In function 'int main()':
test.cxx:5: error: invalid operands of types 'const char*' and 'const char [6]' to binary 'operator+'
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我理解,为什么第一个代码没有抛出任何错误声明?

Sto*_*ica 6

'H'是一个字符,一个整体类型.所以p + 'H'&p['H'](基于数值的索引'H')相同.第一个片段具有未定义的行为,因为数值'H'可能远大于6,但编译器可以自由地不抱怨未定义的行为.

另一方面,"World"它不是一个整体类型,也不是可转换为一个类型.因此无法执行添加,指向空白.