任何人都可以帮助解释以下构造函数的工作原理,
class StringData {
public:
/**
* Constructs a StringData explicitly, for the case of a literal whose size is known at
* compile time.
*/
struct LiteralTag {};
template<size_t N>
StringData( const char (&val)[N], LiteralTag )
: _data(&val[0]), _size(N-1) {}
private:
const char* _data; // is not guaranted to be null terminated
mutable size_t _size; // 'size' does not include the null terminator
}
为什么不只使用此构造函数?
StringData(const char *c):_data(c){}
完整的源代码可以在这里找到:http://api.mongodb.org/cplusplus/1.7.1/stringdata_8h_source.html
最佳答案
使用StringData(const char *c):_data(c){}
时,您将不知道大小,或者必须在运行时使用strlen
来确定大小。除非char数组以null终止(以char'\ 0'结尾),否则该方法无效。
使用模板版本,编译器将在编译时确定数组的大小,并正确初始化size成员。构造函数接受对固定大小数组的引用,编译器将根据传递给构造函数的实际数组(和大小)实例化匹配的构造函数。这一切都是在编译时发生的,不太容易出现人为错误。