std::move- 如何警告程序员不要使用 *moved from* 对象

std::move- How to warn programmer not to use *moved from* object

假设有这样一个函数:

int * func()
{
  std::unique_ptr<int> ptr(new int(3));
  //Few more lines of code

  //then one function added where programmer writes like some thing

  SOME_OTHER_FUNC(std::move(ptr));

  return ptr.get();
}



void SOME_OTHER_FUNC(std::unique_ptr<int> arg_ptr)
{
}

有没有办法警告程序员避免使用std::move出现此类错误?这不仅涉及 unique_ptr,还涉及其他对象。

当我们不恰当地使用 moved-from 对象时,是否有任何机制可以生成警告?

std::move 警告。如果你的程序员不明白这一点,你必须更好地教育他们。如果函数太长以至于程序员可以合理地忽略移动,则需要重构函数以使其更短。

并非所有问题都可以或应该在源代码中解决。

  1. 使用unique_ptr是实现细节;封装一下。

  2. 为函数和使用测试指定前置和post条件。

如果有编译器的帮助就好了,不是吗?有充分的理由它并不像您想象的那么简单:

  1. std::move() 不是魔术,您可以编写自己的类似函数。编译器怎么知道你的新函数必须以同样的方式处理?您需要一个标准属性来装饰函数。如果您将警告特定于确切的函数 std::move,您会将标准库的知识编码到语言编译器中。
  2. 虽然通常,一个移出的对象只能被分配或销毁,一些类可能对移出的状态给出更强的保证(对于例如,一个容器在移动时可以被记录为一个有效的空集合)。您如何告诉编译器哪些操作对特定的移出对象是安全的?

¹ 反驳:编译器已经做了类似的事情,当然,在验证 std::printf()std::scanf() 函数族的格式字符串时。