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

Luk*_*pin 0 c++ move-semantics c++11 c++17

我正在尝试对我的函数中的所有局部变量使用auto.

请使用以下代码:

class obj 
{
  public:
  obj() {};
  obj( obj&& o ) = delete;
};

int main()
{
  obj test0;
  auto test1 = obj();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译代码:

$ 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();
Run Code Online (Sandbox Code Playgroud)

请注意,定义test0完全没问题,但尝试执行完全相同类型的test1声明是编译器错误.显然应该是编译器错误,但在这种情况下,是否意味着obj无法用auto定义?我正在使用我无法控制的QT对象来解决这个问题.

我还在使用C++ 98格式来声明变量,还是有其他方法可以使用auto?

谢谢!!!

T.C*_*.C. 5

这在C++ 17中是可以的; 保证复制省略调整规则,以便移动构造函数甚至不在概念上调用,因此删除或无法访问它并不重要.

在此之前,如果你auto非常喜欢,你可以做到

auto&& test1 = obj();
Run Code Online (Sandbox Code Playgroud)

这将创建一个临时obj对象并将其绑定到引用test1,从而将其生命周期延长到引用的生命周期.除了少数例外,这种行为与使用plain的C++ 17中的行为非常相似auto.