0

假设我有以下结构:

class HeavyClass {

    public:
        static inline HeavyClass const &get() { // note the &
            return h_;
        }
    private:
        static HeavyClass h_;
};

HeavyClass HeavyClass::h_();

int main() {
    HeavyClass foo = HeavyClass::get(); // critical line
    return 0;
}

我的问题是,这真的会在关键线上做我想要的吗?也就是说, foo 会是 h_ 的副本,还是实际上是 h_ 就好像它是通过引用传递的?

非常感谢!

4

3 回答 3

3

您正在制作副本。

该函数get确实返回一个引用,但您是按值分配它:

HeavyClass foo = HeavyClass::get(); // critical line

在这里的关键线上,关键部分是 的定义foofoo不是对-的引用HeavyClass——它是一个HeavyClass自身。因此,foo 不能作为对任何事物的引用。

C++ 没有魔法,只有逻辑。好吧,好吧,也许有魔法,但没有一个是隐藏的。一切尽在眼前。在这里,您声明了 a HeavyClass,而不是 reference-to- HeavyClass,因此它不会神奇地成为引用。

如果你想要一个参考,像这样声明 foo :

const HeavyClass& foo = HeavyClass::get()

顺便说一句,您似乎正在尝试构建一个 Singleton。在继续之前,请至少研究并了解为什么单身人士通常被认为是不好的所有论点。

于 2013-10-03T19:05:40.340 回答
3

我认为你需要类似的东西:

const HeavyClass& foo = HeavyClass::get();

如果你想foo成为h_.

于 2013-10-03T19:02:09.877 回答
2

右侧的值与确定您已声明为 type 的变量的类型无关HeavyClass。因此,该类型的新对象被实例化并使用右侧的值进行初始化。右侧是左值的事实并不重要(它将进行左值到右值的转换)。

函数的返回类型是否为引用不会改变函数调用的,只会改变值category

请注意,这与auto: 如果您说auto x = HeavyClass::get();的是完全相同的,出于相同的原因(auto推断类型,而不是值类别),它将是相同的。

于 2013-10-03T19:02:09.737 回答