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
是警告。如果你的程序员不明白这一点,你必须更好地教育他们。如果函数太长以至于程序员可以合理地忽略移动,则需要重构函数以使其更短。
并非所有问题都可以或应该在源代码中解决。
使用unique_ptr
是实现细节;封装一下。
为函数和使用测试指定前置和post条件。
如果有编译器的帮助就好了,不是吗?有充分的理由它并不像您想象的那么简单:
std::move()
不是魔术,您可以编写自己的类似函数。编译器怎么知道你的新函数必须以同样的方式处理?您需要一个标准属性来装饰函数。如果您将警告特定于确切的函数 std::move
,您会将标准库的知识编码到语言编译器中。
- 虽然通常,一个移出的对象只能被分配或销毁,一些类可能对移出的状态给出更强的保证(对于例如,一个容器在移动时可以被记录为一个有效的空集合)。您如何告诉编译器哪些操作对特定的移出对象是安全的?
¹ 反驳:编译器已经做了类似的事情,当然,在验证 std::printf()
和 std::scanf()
函数族的格式字符串时。
假设有这样一个函数:
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
是警告。如果你的程序员不明白这一点,你必须更好地教育他们。如果函数太长以至于程序员可以合理地忽略移动,则需要重构函数以使其更短。
并非所有问题都可以或应该在源代码中解决。
使用
unique_ptr
是实现细节;封装一下。为函数和使用测试指定前置和post条件。
如果有编译器的帮助就好了,不是吗?有充分的理由它并不像您想象的那么简单:
std::move()
不是魔术,您可以编写自己的类似函数。编译器怎么知道你的新函数必须以同样的方式处理?您需要一个标准属性来装饰函数。如果您将警告特定于确切的函数std::move
,您会将标准库的知识编码到语言编译器中。- 虽然通常,一个移出的对象只能被分配或销毁,一些类可能对移出的状态给出更强的保证(对于例如,一个容器在移动时可以被记录为一个有效的空集合)。您如何告诉编译器哪些操作对特定的移出对象是安全的?
¹ 反驳:编译器已经做了类似的事情,当然,在验证 std::printf()
和 std::scanf()
函数族的格式字符串时。