重载char*和std::string安全吗?
Is it safe to overload char* and std::string?
我刚刚在一本初学者的书中读到了重载函数。出于好奇,我想问一下在char*和std::string之间重载是否安全。
我使用下面的代码并得到一些结果。但我不确定这是否是一种未定义的行为。
void foo(std::string str) {
cout << "This is the std::string version. " << endl;
}
void foo(char* str) {
cout << "This is the char* version. " << endl;
}
int main(int argc, char *argv[]) {
foo("Hello"); // result shows char* version is invoked
std::string s = "Hello";
foo(s); // result shows std::string version
return 0;
}
是的,它是安全的,只要你把它做成const char*
,而且实际上经常有用。自c++ 11起,字符串字面值不能转换为char*
(在此之前已弃用)。
将为字符串字面值选择const char*
过载,因为字符串字面值是const char[N]
(其中N
是字符数)。重载有一种优先级排序,当多个重载都可以工作时,将选择哪个重载。它被认为是执行数组到指针转换比构造std::string
更好的匹配。
为什么重载std::string
和const char*
是有用的?例如,如果您有一个std::string
和一个bool
的重载,那么当您传递字符串字面量时,bool
将被调用。这是因为bool
重载仍然被认为是比构造std::string
更好的匹配。我们可以通过提供const char*
过载来解决这个问题,它将击败bool
过载,并且可以转发到std::string
过载。
简短的回答:绝对安全。考虑以下用法:
foo("bar");//uses c string
foo(std::string("bar") );//uses std::string
char* bar = "bar";
foo(bar);//uses c string
std::string bar_string = "bar";
foo(bar_string);//uses std::string
foo(bar_string.c_str()); //uses c string
需要注意的是,有些编译器(即启用了c++11的编译器)需要在形参规范中使用const关键字,以便允许使用临时字符串。
例如,为了得到这个:foo("酒吧");你需要这个:
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 附加类型安全的子类std::string
- 在线程中使用 std::string 函数是否安全?(C++)
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 存储指向 std::string 数据的指针是否安全?
- std:string::substr 异常安全吗?
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 将无符号的 int 与 std::string::size_type 进行比较是否安全
- 假设 sizeof(std::unordered_map<std::string, T>) 对于所有 T 都相同,实际上是安全的?
- 将std::string附加到自身是否安全
- 在 boost::unordered_map 的 std::string 和 std::list 中提供线程安全,同时对
- 将 nullptr 分配给 std::string 是安全的
- 需要为Solaris 10上的GNU g++2.95.3设置线程安全的std::string
- 重载char*和std::string安全吗?
- 使用std::string在内存中移动jpeg是否安全?
- 测试std::string对char*的相等性,operator==()是否总是安全的
- 这种使用std::string的方式安全吗?
- 按值返回std::string是否安全?