使用auto将类声明为函数内部的变量

C++: Using auto to declare classes as variables inside functions

本文关键字:函数 内部 变量 声明 auto 使用      更新时间:2023-10-16

我试图在我的函数中的所有局部变量使用auto。

取以下代码:

class obj 
{
  public:
  obj() {};
  obj( obj&& o ) = delete;
};
int main()
{
  obj test0;
  auto test1 = obj();
  return 0;
}

编译代码:

$ g++ --std=c++1z main.cpp
main.cpp: In function ‘int main()’:
main.cpp:13:20: error: use of deleted function ‘obj::obj(obj&&)’
   auto test1 = obj();

注意,定义test0是完全可以的,但是试图对test1做完全相同类型的声明会导致编译器错误。显然,这应该是一个编译器错误,但在这种情况下,这是否意味着obj不能用auto定义?我遇到这个问题与QT对象我没有控制。

我是否还在使用c++ 98格式来声明变量,或者是否有另一种方法来使用auto?

谢谢! !

这在c++ 17中是可以的;保证复制省略调整了规则,使得move构造函数甚至在概念上都不被调用,因此它是否被删除或不可访问都无关紧要。

在那之前,如果你这么喜欢auto,你可以做

auto&& test1 = obj();

创建一个临时的obj对象,并将其绑定到引用test1,将其生命周期延长到引用的生命周期。除了少数例外,其行为与c++ 17中使用纯auto所得到的行为几乎相同。

此错误与auto的具体使用无关。

obj test1 = obj();

也不能编译。obj()是一个r值,编译器试图移动它,但删除了移动构造函数。删除move构造函数也会阻止编译器创建复制构造函数,因此它也不能复制它,因此出现错误。

在声明

auto test1 = obj();

编译器尝试移动rhs上的对象,因为它是一个右值。它不能(因为移动元素被标记为已删除)。注意,因为删除了move变量,所以拷贝变量也会被删除,尽管编译器只会尝试移动(因为即使删除了move变量,它仍然被认为是用户定义的,并且在重载解析期间被选为候选变量)。因此,您的代码无法编译。