《C++之旅》9.3节string_view示例代码编译错误咨询
问题分析与解决
你遇到的问题确实是原示例代码的兼容性bug,原因如下:
string res(sv1.length()+sv2.length());这一行调用的构造函数,在C++11之前的标准里根本不存在——早期std::string要求创建指定长度的字符串时,必须同时提供填充字符(比如string res(n, '\0'))。
虽然C++11新增了explicit std::string(size_type n)构造函数(用来创建含n个空字符的字符串),但部分编译器或编译配置可能对这个构造函数的匹配有严格限制,导致你看到的错误。
修复代码
把构造字符串的行改成以下两种方式之一,就能在所有支持string_view的C版本(C17及以上)中正常编译:
方式1:明确指定填充字符
string res(sv1.length() + sv2.length(), '\0');
方式2:更简洁的拼接方式
string res(sv1.begin(), sv1.end()); res += sv2;
补充说明
原代码的写法在部分严格遵循标准的编译器环境下可能通过,但它依赖的std::string(size_type)构造函数是C++11才加入的,且属于explicit构造,容易引发匹配问题。原书的这个示例确实存在兼容性瑕疵,勘误表没收录可能是因为属于边缘场景。
内容的提问来源于stack exchange,提问作者user20407427
相关产品推荐
相关产品推荐

