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

auto keyword behavior with references

假设我有一个简单的 c++ class,其中包含一个私有成员和一个 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& 替换 auto :

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 实际上会推导出引用。您将如何(从句法上)使它成为一个值?