ven*_*ngy 3 c++ stdstring string-literals
下面的代码输出
rm-data;
Content-Disposition: form-data;
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/h5z89qv6f
#include <iostream>
#include <string>
int main()
{
std::string a = "Content-Disposition: form-data;" + '\r' + '\n';
std::cout << a << std::endl;
std::string b = "Content-Disposition: " + std::string("form-data;") + '\r' + '\n';
std::cout << b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我期望a有一个 CRLF 连接,但看起来它通过添加\r (13) + \n (10) = 23文本内起始偏移量的 ASCII 值来进行指针算术。
但是,对于b,CRLF 已正确连接。
也许更好的方法是
std::string a = "Content-Disposition: form-data;" + std::string("\r\n");
Run Code Online (Sandbox Code Playgroud)
或者
std::string a = "Content-Disposition: form-data;\r\n";
Run Code Online (Sandbox Code Playgroud)
问题
CRLF 之前的数据类型是否决定串联规则?
这个表达式:
"Content-Disposition: form-data;" + '\r' + '\n'
Run Code Online (Sandbox Code Playgroud)
...就类型而言是:<string literal> + <char> + <char>。这不受直接支持,因此它会寻找允许其工作的转换,并提出<char *> + <integer> + <integer>.
因此,我们最终得到一个指向字符串文字中间(或末尾)的指针。
这个表达式:
"Content-Disposition: " + std::string("form-data;") + '\r' + '\n'
Run Code Online (Sandbox Code Playgroud)
...就类型而言是:
<string literal> + <string> + <char> + <char>
Run Code Online (Sandbox Code Playgroud)
同样,这是从左到右完成的,所以我们从 开始<string literal> + <string>。这不是直接支持的,但<char *> + <string>确实如此,所以这就是它的作用(产生<string>结果)。这导致<string> + <char>,它被直接支持(并且再次返回 a <string>)。然后又是同样的事情。正如您所期望的,<string> + <char>生成一个字符串,该字符连接到末尾。
在大多数情况下,字符串文字将转换为指向 ( const)的指针char,因此任何进行加法(或类似操作)的尝试都将影响指针,而不是底层存储的数据,除非另一个操作数(例如std::string)提供了过载pointer to const char(或array of const char大小合适)。