非构造函数成员函数中的显式字符串行为
Explicit string behavior in non-constructor member functions
希望我的题目写对了。
我有一个非常大/旧的数据库,其中有许多非null终止的字符数组和一些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.
可以做不同的事情。其中之一是delete
-使const char*
过载:
void AddCell(const std::string&);
void AddCell(const char*) = delete;
void AddCell(const char*,size_t);
将函数标记为delete
会在使用时触发编译器错误,但不会将其从重载候选函数集中删除。如果用户传递一个const char*
,第二个过载将被拾取,编译器将提示重载已被删除。
template <size_t N>
void AddCell(const char (&array)[N]) {
AddCell(array, N);
}
这允许AddCell("MyCell")
,因为字面量是一个数组,最好的候选者是模板,它将以适当的大小分配给(const char*,size_t)
过载。
您可以更改第一个重载,使其不接受std::string引用,而是接受对您创建的新类型的引用,该类型具有从std::string的隐式转换。因此,您不会看到const char*的隐式转换,但会接受std::string,没有问题。
- 在c++构造函数中使用随机字符串生成器
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- C 字符串在显式构造函数中分配值C++?
- 我用字符串做了一个C++构造函数,但它不会打印出字符串
- C++继承:构造函数中的字符串构造
- 在派生自线程类的构造函数中传递字符串
- 性能 - 使用字符串构造函数与使用串联
- 字符串构造函数将两个字符* 放入另一个 std::string 在 C++14 中有效,但不适用于 C++17
- 调用哪个字符串构造函数
- 使用子字符串构造函数构建字符串 - 调试 - 当自动跳过代码时
- 使用字符串构造函数从wstring转换为字符串时,是否没有可能的数据丢失
- 不分配任何字符内存的常量字符串构造函数?
- 常量 char* 的字符串构造函数更改常量 char* 的值
- 为什么从std::string的initializer列表中填充std::向量不会调用std::字符串构造函数
- 为什么 C++03 文件流不接受字符串构造函数参数?
- 带有char*内存泄漏的字符串构造函数
- BigNum类字符串构造函数错误
- CPP字符串构造函数查找并附加空字符
- c++的字符串构造函数
- c++ std::复制结果不同于字符串构造函数