带有引用的自动关键字行为
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
实际上会推导出引用。您将如何(从句法上)使它成为一个值?
假设我有一个简单的 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
实际上会推导出引用。您将如何(从句法上)使它成为一个值?