![](/img/trans.png)
[英]The compiler doesn't complain when vector<char>&& is bound to vector<char>&
[英]Why doesn't the compiler complain about adding char to char*?
为什么c ++编译器不会抱怨以下代码?
#include<iostream>
int main()
{
const char* p ="Hello";
std::string q = p + 'H';
std::cout << q << std::endl;
}
它正确地抛出了以下代码的错误
#include<iostream>
int main()
{
const char* p ="Hello";
std::string q = p + "World";
std::cout << q << std::endl;
}
编译器抛出的错误语句
test.cxx: In function 'int main()':
test.cxx:5: error: invalid operands of types 'const char*' and 'const char [6]' to binary 'operator+'
有人可以帮助我理解,为什么第一个代码没有抛出任何错误声明?
'H'
是一个字符,是一个整体类型。 因此p + 'H'
与&p['H']
(您基于'H'
的数值进行索引)。 第一个片段具有未定义的行为,因为'H'
的数值可能远大于6,但编译器可以自由地不抱怨未定义的行为。
另一方面, "World"
不是一个整体类型,也不是可转换为一个类型。 因此无法执行添加,指向空白。
'H'
是单个字符,其类型为char
。 char
可以隐式转换为int
,因此它会将此值添加到指针p
(通过该值前进)。
请注意,它仍然是未定义的行为,因为新指针q
指向数组之外。
两者都不执行字符串连接(如您所料)。
对于p + 'H'
,执行指针运算。 'H'
被视为一个值为72
的整数,然后p + 'H'
将尝试返回指向数组"Hello"
的第73个元素的指针,它越过边界并通向UB ,这意味着什么是可能的; 编译器不需要为它发出诊断。
对于p + "World"
,你要添加两个指针(即const char*
),这根本没有意义。
我想你想做字符串连接,然后你应该使用std::string
而不是像std::string p ="Hello";
这样的指针std::string p ="Hello";
,或使用字符串文字 (来自C ++ 14),例如std::string q = p + "World"s;
,两者都会为你执行字符串连接。
在这个声明中
std::string q = p + "World";
字符串文字"World"
被转换为指向其第一个字符的指针,其类型为const char *
。
所以尝试添加两个指针。 此类操作未定义,编译器发出错误。
在这个声明中
std::string q = p + 'H';
有一个有效的操作,添加一个整数值'H'
(由于对指针的整数提升,它被隐式转换为int
类型。在用作初始化器的表达式中,使用了所谓的指针算法。编译器不检查结果指针是否指向超出字符串文字。因此不会发出诊断。
因为添加char litteral'H'就像向char添加任何其他有效char值,而添加“Hello”意味着添加指向字符串的指针,该字符串显然是不兼容的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.