如下的代码,当只提供入参是std::string
的版本时,当传入const char*
时会构造一个std::string
对象。
#include <iostream>
#include <format>
#include <string>
#include <string_view>
#include <iomanip>
void print(const std::string& str){
std::cout << "**version1**, " << __func__ << ", " << str << std::endl;
}
/*void print(const char* str){
std::cout << "--version2--, " << __func__ << ", " << str << std::endl;
}
void print(const std::string_view str){
std::cout << "==version3==, " << __func__ << ", " << str << std::endl;
}*/
auto main()->int{
const char* ch = "const char*";
std::string str("std::string");
print(ch); // **version1**, print, const char*
print(str); // **version1**, print, std::string
}
可以提供重载的print来避免上述问题,不过会增加代码量。
#include <iostream>
#include <format>
#include <string>
#include <string_view>
#include <iomanip>
void print(const std::string& str){
std::cout << "**version1**, " << __func__ << ", " << str << std::endl;
}
void print(const char* str){
std::cout << "--version2--, " << __func__ << ", " << str << std::endl;
}
/*void print(const std::string_view str){
std::cout << "==version3==, " << __func__ << ", " << str << std::endl;
}*/
auto main()->int{
const char* ch = "const char*";
std::string str("std::string");
print(ch); // --version2--, print, const char*
print(str); // **version1**, print, std::string
}
而使用std::string_view作为入参可以同时兼容入参是std::string和const char*的情况。
#include <iostream>
#include <format>
#include <string>
#include <string_view>
#include <iomanip>
/*void print(const std::string& str){
std::cout << "**version1**, " << __func__ << ", " << str << std::endl;
}
void print(const char* str){
std::cout << "--version2--, " << __func__ << ", " << str << std::endl;
}*/
void print(const std::string_view str){
std::cout << "==version3==, " << __func__ << ", " << str << std::endl;
}
auto main()->int{
const char* ch = "const char*";
std::string str("std::string");
print(ch); // ==version3==, print, const char*
print(str); // ==version3==, print, std::string
}
但是当三个版本的print
都提供时编译器还是会进行最佳匹配。
#include <iostream>
#include <format>
#include <string>
#include <string_view>
#include <iomanip>
void print(const std::string& str){
std::cout << "**version1**, " << __func__ << ", " << str << std::endl;
}
void print(const char* str){
std::cout << "--version2--, " << __func__ << ", " << str << std::endl;
}
void print(const std::string_view str){
std::cout << "==version3==, " << __func__ << ", " << str << std::endl;
}
auto main()->int{
const char* ch = "const char*";
std::string str("std::string");
print(ch); // --version2--, print, const char*
print(str); // **version1**, print, std::string
}