这个问题有太多的混乱。我会尽力把事情说清楚......
本节描述 std 定义对象的移出状态:
17.6.5.15 [lib.types.movedfrom]
C++ 标准库中定义的类型的对象可以从
(12.8)。移动操作可以显式指定或隐式指定
生成的。除非另有规定,此类移出的物体应
被置于有效但未指定的状态。
这是什么意思?这意味着,给定一个标准定义的移出对象,您可以对该对象执行任何操作,而无需先验了解该对象的状态。不需要先验了解当前状态的动作类别是没有先决条件的动作。
例如你可以打电话clear()
在搬离vector
因为没有任何先决条件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)。
返回:如果 R 为 void,则无任何内容,否则为 INVOKE 的返回值
(f, std::forward( args)..., R)。
抛出: bad_function_call if !*this;否则,抛出任何异常
通过包装的可调用对象。
请注意,没有前提条件或 Requires 子句。这意味着调用呼叫操作员function
搬离的function
不是未定义的行为。无论处于何种状态function
是,您不会因此调用而违反任何先决条件。
请注意,规范在任何情况下都不会说该调用不会产生任何效果。所以没有效果是不可能的。
该调用将调用包装的函数,或者抛出一个bad_function_call
。这是唯一的两个选择。它的行为取决于function
目的。和状态function
对象未指定([lib.types.movedfrom])。