为什么C++ 17的std :: any不允许any_cast返回一个可移动的值?

nsh*_*hct 14 c++ std move-semantics c++17

std::any根据本Wiki中提供的规范实现C++ 17时,我偶然发现了一些对我来说荒谬的事情:

自由函数的定义std::any_cast,用于从std::any实例中检索值,提供了r值引用的重载(它是第三个):

template< class ValueType >
ValueType any_cast(any&& operand); // (3)
Run Code Online (Sandbox Code Playgroud)

现在,在概要下面列出的要求适用于重载2和3(这也意味着包括r值重载):

2-3) 返回 *any_cast<std::remove_reference_t<ValueType>>(&operand)

该定义似乎实际上不允许移动数据!

函数调用只是重定向到基于指针的重载; 有关临时性质的信息operand 丢失了!

是不是我不能离开任何一个实例?这只是wiki中的一个错误吗?我错了吗?

Mar*_* A. 10

在撰写本文时,问题出现在WP状态,这意味着:

WP - (工作文件) - 提议的决议未被接受为技术勘误,但WG21/PL22.16的完整委员会已投票决定将缺陷报告的拟议决议应用于工作文件.

有关详细信息,请参阅lwg:http://wg21.cmeerw.net/lwg/issue2509

确实提出了一项决议案

对于第三种形式,if is_move_constructible_v<ValueType>为true且is_lvalue_reference_v<ValueType>为false std::move(*any_cast<remove_reference_t<ValueType>>(&operand)),否则,*any_cast<remove_reference_t<ValueType>>(&operand)

以及列出WP的缺陷报告列表:http://cplusplus.github.io/LWG/lwg-defects.html#2509

  • 它实际上在[WP](http://cplusplus.github.io/LWG/lwg-defects.html#2509)中. (2认同)
  • @TC.对于那些不理解每2个字母的缩写,似乎[WP](https://cplusplus.github.io/LWG/lwg-active.html#WP)是[DR]之后的状态(https:/ /cplusplus.github.io/LWG/lwg-active.html#DR)委员会已将更改折叠成工作文件(即,从某种意义上说,它是一个"被接受的"缺陷报告?但不是那么接受它是100%肯定要进入下一个标准,只有99.9%?),但我不太清楚元标准,以确定我是否正确阅读这些定义. (2认同)
  • 这是libfun2的WP,但不适用于C++ 1z (2认同)