带有引用的自动关键字行为
auto keyword behavior with references
假设我有一个简单的 c++ 类,其中包含一个私有成员和一个 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& 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
实际上会推导出为参考。您将如何(语法上)使其成为值?
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何确保C++函数在定义之前声明(如override关键字)
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- C 有一个关键字,允许从派生类引用基本类型
- 派生类中的方法在引用的类中没有 *virtual* 关键字的情况下执行
- 带有引用的自动关键字行为
- 使用此关键字在结构中引用类时出现问题
- 使用boost::引用元组作为orderedunique索引的关键字时出现boost多索引插入错误
- 避免在使用"new"关键字后不断取消引用的标准方法是什么?
- C++语法/语义问题:对Function和typedef关键字的引用
- 为什么new关键字返回指针而不是引用
- C#通过引用(ref关键字)问题