将引用传递给未知长度数组而不是指针是否优雅?

时间:2014-02-02 09:12:41

标签: c++ reference

请考虑以下概念验证片段:

#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,只要父对象在范围内,缓冲区就不会被释放,因此我发现返回的对象作为引用更加优雅。

但是,我想知道实际返回对这样的可变长度数组的引用是否优雅。也就是说,将指针转换为对第一个对象的引用,然后将引用转换回指针。

2 个答案:

答案 0 :(得分:2)

你不应该使用什么:

  • a const char* - 当然,每个人都会认识到可能是一个C风格的字符串,可能永远不会为null ,但他们必须检查您的文档以确定。它实际上可能只是指向可能为空的单个char的指针。

  • a const char& - 绝对不要这样做。这实际上暗示您只返回对单个char的引用。没有人会想到“哦,它可能是对C风格字符串中第一个字符的引用,所以我需要记下它的地址。”这不仅会让人们阅读您的文档,而且还会让他们感到困惑。

你应该使用什么:

  • a std::string - 这完全是明确的。你正在返回一个字符串,毫无疑问,它不能为空。这准确描述了您的函数打算返回的内容。

答案 1 :(得分:0)

  

这个想法是read_file()函数应该返回一个指针......

如果该函数被用来返回指针,则返回一个指针。如果不允许返回NULL,您可以在评论中这样说。

将指针转换为引用,期望函数的用户将其转换回指针,这不是更优雅:它是错综复杂的。

保持简单,你班级的用户(也许是你自己?)会很感激。