请考虑以下概念验证片段:
#include <iostream>
const char* random_string_for_the_sake_of_testing = "123";
template <class T>
const T& read_file()
{
const T* data;
data = random_string_for_the_sake_of_testing;
return *data;
}
int main(int argc, char* argv[])
{
std::cout << &read_file<char>() << std::endl;
}
这个想法是read_file()
函数应该返回一个指向缓冲区的指针,该缓冲区包含已转换为请求类型的mmap-ed文件。代码永远不会返回NULL
,只要父对象在范围内,缓冲区就不会被释放,因此我发现返回的对象作为引用更加优雅。
但是,我想知道实际返回对这样的可变长度数组的引用是否优雅。也就是说,将指针转换为对第一个对象的引用,然后将引用转换回指针。
答案 0 :(得分:2)
你不应该使用什么:
a const char*
- 当然,每个人都会认识到可能是一个C风格的字符串,可能永远不会为null ,但他们必须检查您的文档以确定。它实际上可能只是指向可能为空的单个char
的指针。
a const char&
- 绝对不要这样做。这实际上暗示您只返回对单个char
的引用。没有人会想到“哦,它可能是对C风格字符串中第一个字符的引用,所以我需要记下它的地址。”这不仅会让人们阅读您的文档,而且还会让他们感到困惑。
你应该使用什么:
std::string
- 这完全是明确的。你正在返回一个字符串,毫无疑问,它不能为空。这准确描述了您的函数打算返回的内容。答案 1 :(得分:0)
这个想法是read_file()函数应该返回一个指针......
如果该函数被用来返回指针,则返回一个指针。如果不允许返回NULL
,您可以在评论中这样说。
将指针转换为引用,期望函数的用户将其转换回指针,这不是更优雅:它是错综复杂的。
保持简单,你班级的用户(也许是你自己?)会很感激。