假设我有一个包含私有成员和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
关键字的预期行为还是错误?
如果这是预期的,这种行为的原因是什么?这是一个技术限制吗?如果它是设计的,为什么?
答案 0 :(得分:7)
推断出auto
时,不会推导出参考。它总是推导出价值。如果您希望获得对返回值的引用,则可以auto&
,const auto&
或auto&&
。
是的,这是设计的。任何其他行为实际上都会令人惊讶。更糟糕的是,您可以在需要时轻松使用参考。但是,假设auto
实际上会推断出参考。你如何(语法上)使它成为一个值?