【发布时间】:2017-01-28 02:50:49
【问题描述】:
我正在阅读documentation for std::any_cast,我发现 API 的强制转换要么返回一个值到所持有的对象,要么返回一个指向它的指针,这很奇怪。为什么不返回参考?每次使用非指针类型参数调用函数时都需要进行复制。
我可以看到强制转换的指针版本可能会更多地表明意图并且可能更清楚一些,但是为什么不将返回的值作为这样的引用呢?
template<typename ValueType>
ValueType& any_cast(any* operand);
而不是
template <typename ValueType>
ValueType* any_cast(any* operand);
此外,即使您要求引用,强制转换也会删除引用并将副本返回到存储的对象,请参阅此处http://en.cppreference.com/w/cpp/utility/any/any_cast 函数重载 1-3 的返回值的解释@
【问题讨论】:
-
如果输入指针是
nullptr呢?不能取消引用以满足返回的引用。我认为您真正要问的是为什么将引用作为输入的any_cast的重载返回副本而不是引用作为输出,不是吗? -
any_cast提供参考,如果你告诉它。这就像说static_cast总是返回一个副本。 -
不能被引用的给定类型的有效指针值的数量取决于人们对标准的阅读和标准的演变,但它肯定大于 0,因为它包含空指针。
-
想一想,似乎很奇怪。我猜您或某人™ 将不得不查找原始论文或论文,以找到理由。似乎不太实用,有异常问题和性能。
-
@Curious:
any_cast<Something&>将在内部处理对象时删除引用,但它仍会返回Something&作为输出。