假设我有一个包含私有成员和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没有被编辑.确实,如果我用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实际上会推断出参考.你如何(语法上)使它成为一个价值?
| 归档时间: | 
 | 
| 查看次数: | 631 次 | 
| 最近记录: |