我正在尝试对我的函数中的所有局部变量使用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?
感谢!!!
答案 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值,编译器尝试移动但删除了移动构造函数。删除移动构造函数也会阻止编译器创建复制构造函数,因此它也不能复制它,因此会出错。