std :: move-如何警告程序员不要使用*从*对象移动

时间:2016-10-05 14:39:34

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

假设有这样的函数:

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,也适用于其他对象。

当我们不恰当地使用移动的对象时,是否有任何生成警告的机制?

3 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:0)

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

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

  2. 指定函数的前置和后置条件并使用测试。

答案 2 :(得分:0)

让编译器帮助会很好,不是吗?有充分的理由说它并不像你想象的那么简单:

  1. std::move()不是魔法,你可以编写自己的类似功能。编译器如何知道您的新函数必须以相同的方式处理?您需要一个标准属性来装饰该函数。如果您针对确切的函数std::move发出警告,则可以将标准库的知识编码为语言编译器¹。
  2. 虽然一般,但移动对象只能被分配或销毁,某些类可能会对移出状态提供更强的保证(例如,容器可以记录为变为移动时的有效空集合)。如何告诉编译器哪些操作对特定的移动对象是安全的?
  3. ¹反驳论点:当然,在验证std::printf()std::scanf()系列函数的格式字符串时,编译器已经做了类似的事情。