围绕这个问题有太多的困惑。我会尽量把事情说清楚...
本节描述标准定义对象的移出状态:
17.6.5.15 [lib.types.movedfrom]
C++ 标准库中定义的类型的对象可以从
(12.8)。移动操作可以显式指定或隐式指定
生成。除非另有规定,此类搬离对象应
置于有效但未指定的状态。
这是什么意思?这意味着给定一个标准定义的移动对象,您可以对该对象执行任何操作,而无需事先了解该对象的状态。不需要先验知识当前状态的一类动作是那些没有先决条件的动作。
例如,您可以在移出的vector 上调用clear(),因为vector::clear() 没有先决条件。但是你不能打电话给pop_back(),因为那确实有先决条件。
具体看function的调用运算符:
20.8.11.2.4 [func.wrap.func.inv]
R operator()(ArgTypes... args) const
效果:INVOKE(f, std::forward(args)..., R) (20.8.2),其中
f 是 *this 的目标对象 (20.8.1)。
Returns:如果 R 为 void,则返回 Nothing,否则 INVOKE 的返回值
(f, std::forward(args)..., R)。
抛出:bad_function_call if !*this;否则,抛出任何异常
通过包装的可调用对象。
请注意,没有前置条件或 Requires 子句。这意味着调用移动的function 的function 的调用运算符不是未定义的行为。无论function 处于什么状态,您都不会违反此调用的任何先决条件。
请注意,在任何情况下,规范都没有说调用无效。所以没有效果是不可能的。
调用将调用包装函数,或抛出bad_function_call。这是仅有的两个选择。它的行为取决于function 对象的状态。并且function 对象的状态未指定([lib.types.movedfrom])。