【发布时间】:2012-12-31 08:05:36
【问题描述】:
我希望我的问题标题正确。
我有一个非常大/旧的数据库,其中包含许多非空终止字符数组和一些 std::string 类型。我正在创建一个将使用该数据库的工具,并且我想确保它对于非空终止字符数组的安全性。理想情况下,我希望同时支持这两种类型,以便开发人员轻松使用该工具。
void AddCell( const std::string & _cell_str );
void AddCell( const char * _cell_data, size_t _array_size );
但是,有一个特定的场景可能会出现问题:如果新开发人员不知道 char 数组是非空终止的并且出于懒惰决定使用 std::string 的隐式转换,因为他没有必须输入数组大小,那么 std::string 可能会显示一些不需要的字符。
我该如何处理这个问题?我应该强迫某人指定 std::string 的长度吗?我应该只删除 std::string 重载函数并让每个人都从他们的 std::string 中使用 c_str() 吗?理想情况下,我只使用显式关键字,但它仅适用于构造函数。我犹豫要不要使用 std::string。
【问题讨论】:
-
我在这里缺少一些基本的东西。什么是 std::string 的隐式转换?你指的是
AddCell("example");吗? -
@ahenderson,
std::string的构造函数接受char*并且不是显式的。 -
@MarkRansom 感谢您的澄清。我仍然希望我有一个他们试图避免的行为的例子。
-
我现在很清楚了。如果有人输入
text其中const char text[]然后我们有UB,如果数组不是空终止的。
标签: c++