如何检查变量是否仍然有效或在其上使用了std :: move?

问题描述

我知道在使用std::move之后,该变量仍然有效,但是处于未指定状态。

不幸的是,最近我在代码库中遇到了几个错误,其中一个函数正在访问移动的变量,并且正在发生奇怪的事情。这些问题很难追踪。

在运行时或编译期间,是否有任何编译器选项(用clang表示)或以任何方式引发错误

解决方法

可能会帮助的某些事情:


可以使此类错误易于跟踪的代码更改:

我假设如果您在某物上使用std::move,那么它(并非总是)是一个沉重的容器。

如果是这样,请尝试使用std::unique_ptr<T>来创建它。调用移动器必须显式使用std::move,这很容易发现。其他非所有权访问功能也可以与.get()一起使用。您还可以检查可为空性,并在需要访问它的任何时候抛出它是否为nullptr

,

我知道在使用std :: move之后,该变量仍然有效,但是处于未指定状态。

这不是普遍真理。通常,从其移出的对象处于移动构造函数/赋值运算符离开它的任何状态。

标准库确实保证您至少要描述。但是也有可能为您的类实现一个成员函数,该成员函数不遵守该成员函数,并使从对象移走的成员函数处于无效状态。但是,以您描述的方式实施移动操作是一个不错的设计选择。

如何检查变量是否仍然有效或在其上使用了std :: move?

用这种语言无法进行这种检查。

在运行时或编译期间,是否有任何编译器选项(用clang表示)或以任何方式引发错误?

请注意,在移动之后使用变量不一定完全是一个错误,而可以做的是完全正确的事情。某些类型精确地指定了从对象移出的状态(例如,std::unique_ptr),而其他具有有效性保证的类型可以以没有先决条件的方式使用(例如调用container.size())。 / p>

因此,使用从对象移出仅是一个问题,前提是这违反了前提条件,这将导致不确定的行为。 Clang和其他编译器具有运行时清除程序,它们可能能够捕获某些未定义的行为。还有许多警告选项和静态分析器,可以诊断可能存在错误的情况。

使用它们是一个很好的主意,但您不应仅依赖它们,因为它们将无法找到所有错误。程序员在编写程序时仍然需要小心,并需要将其与语言规则进行比较。遵循RAII之类的常见用法,避免裸露的指针(以及其他资源句柄)对于避免典型的错误大有帮助。