c++ - 使用 `const T &` 持有 Temporary 可以解决什么问题?

标签 c++ c++11 c++14

比如,如果我编写如下所示的代码:

const int & const_value = 10;

与看起来像这样的代码相比,我有什么优势:

int value = 10;

const int const_value = 10;

即使是更复杂的例子,比如

const enterprise::complicated_class_which_takes_time_to_construct & obj = factory.create_instance();

由于复制省略,以下两个代码片段应该不会显着加快或减少内存消耗。

enterprise::complicated_class_which_takes_time_to_construct obj = factory.create_instance();

const enterprise::complicated_class_which_takes_time_to_construct obj = factory.create_instance();

我是否遗漏了一些解释此构造的用途的内容,或者我没有考虑到的隐藏好处?

编辑:

@nwp 提供的答案提供了如下所示的工厂方法示例:

using cc = enterprise::complicated_class_which_takes_time_to_construct;
struct Factory{
    const cc &create_instance(){
        static const cc instance;
        return instance;
    }
} factory;

虽然这是一个很好的例子,说明为什么您通常需要确切的 const reference 构造,但它没有回答为什么需要它来处理临时对象,或者为什么需要这个特定的构造会比将临时对象放在适当的堆栈分配对象中要好,编译器在正常情况下仍然应该能够复制省略。

最佳答案

想象一下工厂很“聪明”并且做了类似的事情

using cc = enterprise::complicated_class_which_takes_time_to_construct;
struct Factory{
    const cc &create_instance(){
        static const cc instance;
        return instance;
    }
} factory;

并进一步假设 cc 是不可复制的,那么 const & 版本可以工作,而其他两个则不能。这对于实现缓存并保留对象的本地 map 的类来说是相当常见的,您可以在映射中获得对对象的引用。

编辑:

编码指南可能会说通过 const & 从函数中获取返回值,因为它普遍适用于值和引用。

cc foo();
cc &foo();
const cc &foo();

如果您使用 const cc &var = foo();,在所有情况下它都可以在没有不必要的拷贝的情况下工作。有时你得到一个临时的,有时你没有,但代码总是做正确的事情,让你自由地改变实现,而不必关心你使用的函数如何返回它的返回值。那里仍然有一个 const 的问题,所以它不是在所有情况下都更好的表示法,但它是一个可行的设计选择。

关于c++ - 使用 `const T &` 持有 Temporary 可以解决什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37577080/

相关文章:

c++ - 如何在多个类中使用相同的 unique_ptr

c++ - 为什么我不能在带模板的派生类中使用基类的别名?

c++ - 在多个线程中递减索引

c++ - 为什么声明函数的顺序会改变 SFINAE 选择的重载?

c++ - std::swap 不可复制但可 move 的结构

c++ - std::error_code 是发出警告的好方法吗?

c++ - 在编译时确定最小共同祖先

c++ - 如何通过编译错误找到 C++ 复制构造函数的使用位置?

c++ - 在 C、C++ 或 Objective C 中验证给定的坐标

c++ - 如何将 char 数组中的前 15 个字符转换为 C++ 中的 std::string?