带引用的auto关键字行为

Bas*_*oud 6 c++ auto

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

class MyClass
{
    private:
        double m_testValue = 1;

    public:
        double& getTestValue(){return m_testValue;}
} 
Run Code Online (Sandbox Code Playgroud)

现在让我们说我想调用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;
Run Code Online (Sandbox Code Playgroud)

输出是

1
1
1
3
Run Code Online (Sandbox Code Playgroud)

这并不是我所期望的,因为很明显,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;
Run Code Online (Sandbox Code Playgroud)

我明白了

1
1
3
3
Run Code Online (Sandbox Code Playgroud)

这就是我想要的.所以问题是:这是auto关键字的预期行为还是一个错误?如果这是预期的,这种行为的原因是什么?这是一个技术限制吗?如果它是设计的,为什么?

Ser*_*eyA 9

auto被推断,它不是推导为参考.它总是推导出价值.如果你想获得对返回值的引用,你可以拥有auto&,const auto&或者auto&&.

是的,它是设计的.任何其他行为实际上都会令人惊讶.更糟糕的是,您可以在需要时轻松使用参考.但是,想象一下,auto实际上会推断出参考.你如何(语法上)使它成为一个价值?