使用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?
谢谢! !
这在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变量,它仍然被认为是用户定义的,并且在重载解析期间被选为候选变量)。因此,您的代码无法编译。
相关文章:
- 在函数内部的声明中初始化数组,并在外部使用它
- 使用C链接在函数内部创建C++模板
- 指针没有更新它在void函数内部指向的值
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- WriteProcessMemory 在函数内部失败
- 如何在C++中传递lambda函数内部的对象实例
- 在析构函数内部处理异常(但不抛出)
- 在函数内部传递字符 *str
- 仅在函数内部构建对象时EXC_BAD_ACCESS
- 是否可以使用类的析构函数内部函数来重置值?
- 如何在函数内部使用 zmq(以非阻塞方式)在客户端请求时获取函数的状态?
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- 我如何从循环内部使用迭代器的函数内部的getter中检索特定的成员
- C++ 修改函数内部的字符
- 从对象成员函数内部删除操作的技术 /设计模式
- C++14 使用捕获说明符递增 lambda 函数内部的值
- 在成员函数内部调用成员函数
- 如何在类构造函数内部对同一类的成员函数启动pthread
- Arduino C++:F()宏在函数内部有意义吗