带有引用的自动关键字行为

auto keyword behavior with references

本文关键字:关键字 引用      更新时间:2023-10-16

假设我有一个简单的 c++ 类,其中包含一个私有成员和一个 getter:

class MyClass
{
    private:
        double m_testValue = 1;
    public:
        double& getTestValue(){return m_testValue;}
} 

现在假设我想调用 getter 来获取我的引用并编辑此值(并在值之前/之后打印)

auto testVal = myClassInstance.getTestValue();
std::cout << myClassInstance.getTestValue() << std::endl;
std::cout << testVal << std::endl;
testVal = 3;
std::cout << myClassInstance.getTestValue() << std::endl;
std::cout << testVal << std::endl;

输出为

1
1
1
3

这并不完全是我所期望的,因为显然,m_testValue没有被编辑过。事实上,如果我用双倍和:

double& testVal = myClassInstance.getTestValue();
std::cout << myClassInstance.getTestValue() << std::endl;
std::cout << testVal << std::endl;
testVal = 3;
std::cout << myClassInstance.getTestValue() << std::endl;
std::cout << testVal << std::endl;

我得到

1
1
3
3

这就是我想要的。所以问题是:这是 auto 关键字的预期行为还是错误?如果这是意料之中的,那么这种行为的原因是什么?是技术限制吗?如果是设计使然,为什么?

当推

auto时,它不会被推导出到参考。它总是推导出值。如果要引用返回值,可以使用 auto&const auto&auto&&

是的,这是设计使然。任何其他行为实际上都会令人惊讶。更糟糕的是,在需要时很容易使用参考。但是,想象一下,auto实际上会推导出为参考。您将如何(语法上)使其成为值?