为什么在代码段中从 char* 转换为 st::string 比从 const char* 更可取
Why conversion from char* to std::string is more preferred than to const char* in the snippet?
我正在学习 boost 的变体,发现它在此片段中从 char*
隐式转换为std::string
:
boost::variant<int, char*, std::string> v;
// implicitly converted from char* to std::string, so we can't store char* and std::string both?
v = "123";
std::cout << "boost::variant value: " << boost::get<std::string>(v) << std::endl;
v = 1;
std::cout << "boost::variant value: " << boost::get<int>(v) << std::endl;
v = "123";
std::cout << "boost::variant value: " << boost::get<char*>(v) << std::endl;
因此,boost::get<char*>(v)
调用将引发异常。我有点纳闷,并试图使其更公平:在字体列表中将char*
更改为const char*
:
boost::variant<int, const char*, std::string> v;
v = "123";
std::cout << "boost::variant value: " << boost::get<std::string>(v) << std::endl;
现在异常是正确的。但我的问题是:为什么编译器/库选择std::string
而不是我指定的char*
?我明白,v = "123"
是const char*
的分配,但为什么它会转换为std::string
而不是char*
?
const char *
不会隐式转换为char *
,因为这是不安全的。const
的全部意义在于您不会无意中尝试修改对象。假设const char *
确实隐式转换为char *
。那么是什么阻止了诸如此类的程序:
#include <cstdio>
void f(char *s) { *s = 'a'; }
int main() { const char *str = "Hello!"; f(str); std::puts(str); }
这显然是一个巨大的错误,从编译甚至没有警告
因为从
std::string
有从const char *
到std::string
的显式转换,并且出于显而易见的原因,删除const
永远不会隐式完成。
相关文章:
- 从函数返回const char*数组
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 在 c++ 中从参数复制本地数组比从数组更快?
- 在C++中使用char*进行从二进制到十进制以及从十进制到二进制的转换
- 如何将 char 指针从 python 传递到C++ API
- 为什么在代码段中从 char* 转换为 st::string 比从 const char* 更可取
- char*在从C DLL返回到js ctypes时丢失
- 从 std::istream 读取时,有没有比 reinterpret_cast<char*>更好的选择?
- 为什么 std::vector<char> 比 std::string 快?
- 如何将char *argv[]从Main函数指向表
- 提升shared_array<char>并从字符* 设置它
- 巨大的.cpp文件比从文本文件读取更好
- 从保留的向量读取比从非保留向量读取更快
- visual c++中支持unicode char的从TCHAR到char*的转换
- 从内存中读取"char"比读取"word"快吗?
- 为什么从int转换到char*与从std::string转换到char*不同?
- 为什么char[1]从我的输入文件中读取整个单词
- 从矢量中删除比从列表中删除花费更少的时间.为什么?
- 为什么使用Python mmap模块比从C++调用POSIX mmap慢得多
- Marsshall char** 用于从托管代码调用非托管代码时串起问题