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

时间:2016-09-16 17:09:54

标签: c++ c++11 move-semantics c++17

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

感谢!!!

3 个答案:

答案 0 :(得分:5)

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

在此之前,如果你非常喜欢function string getHighlightColorForBaseColor(string hexColor) { // Perform some color-theory wizardry and pass back the highlight color } ,那么你可以做到

auto

这将创建一个临时auto&& test1 = obj(); 对象,并将其绑定到引用obj,将其生命周期延长到引用的生命周期。除了少数例外,该行为与使用普通test1的C ++ 17中的行为非常相似。

答案 1 :(得分:3)

在声明中

auto test1 = obj();

编译器尝试在rhs上移动对象,因为它是一个右值。它不能(因为移动ctor被标记为已删除)。请注意,因为删除了移动ctor,所以复制ctor也会被删除,尽管编译器只会尝试移动(因为移动ctor,即使删除了,仍然会考虑用户定义和it is selected as a candidate during overload resolution) 。因此,您的代码无法编译。

答案 2 :(得分:3)

该错误与library(dplyr) y %>% left_join(x, by = c("id_number" = "number")) %>% mutate(name = if_else(location >= from & location <= to, as.character(name), NA_character_)) %>% select(-from, -to) %>% arrange(name) %>% distinct(location, id_number, .keep_all = T) # location id_number name # 1 1.5 30 region 1 # 2 2.8 30 region 2 # 3 2.0 36 region 7 # 4 10.0 38 <NA> # 5 3.5 40 <NA> 具体使用无关。

auto

也没有编译。 obj test1 = obj(); 是一个r值,编译器尝试移动但删除了移动构造函数。删除移动构造函数也会阻止编译器创建复制构造函数,因此它也不能复制它,因此会出错。