带引用的auto关键字行为

时间:2016-05-23 14:46:46

标签: c++ auto

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

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没有被编辑。事实上,如果我用auto和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关键字的预期行为还是错误? 如果这是预期的,这种行为的原因是什么?这是一个技术限制吗?如果它是设计的,为什么?

1 个答案:

答案 0 :(得分:7)

推断出auto时,不会推导出参考。它总是推导出价值。如果您希望获得对返回值的引用,则可以auto&const auto&auto&&

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