C++:使用 auto 将 类 声明为函数内的变量

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

我正在尝试对函数内的所有局部变量使用 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 的方法?

谢谢!!!

在声明中

auto test1 = obj();

编译器尝试移动 rhs 上的对象,因为它是右值。它不能(因为移动构造函数被标记为已删除)。注意因为move ctor被删除了,那么copy ctor也被删除了,虽然编译器只会尝试移动(因为move ctor,即使被删除,它仍然被认为是用户定义的和it is selected as a candidate during overload resolution) .因此,您的代码无法编译。

这在 C++17 中是可以的;有保证的复制省略调整了规则,这样移动构造函数甚至在概念上都不会被调用,所以它是否被删除或不可访问都没有关系。

在那之前,如果你这么爱auto,你可以做到

auto&& test1 = obj();

这将创建一个临时 obj 对象并将其绑定到引用 test1,从而将其生命周期延长至引用的生命周期。除了少数例外,该行为与您在 C++17 中使用纯 auto.

获得的行为几乎相同

该错误与具体使用 auto 无关。

obj test1 = obj();

也不编译。 obj() 是一个右值,编译器尝试移动它,但移动构造函数被删除。删除移动构造函数也会阻止编译器创建复制构造函数,因此它也无法复制它,因此会出现错误。