`std::any_cast` returns 一个副本
`std::any_cast` returns a copy
我正在阅读 documentation for std::any_cast
,我发现奇怪的是 API 强制转换 return 持有对象的值或指向它的指针。为什么不 return 参考?每次使用非指针类型参数调用函数时都需要进行复制。
我可以看到指针版本的转换可能更能表达意图,也可能更清晰,但为什么不让值 returned 像这样作为参考呢?
template<typename ValueType>
ValueType& any_cast(any* operand);
而不是
template <typename ValueType>
ValueType* any_cast(any* operand);
此外,即使您请求引用,强制转换也会删除引用,并且 return 是存储对象的副本,请参阅函数重载 1-3 的 return 值的解释这里 http://en.cppreference.com/w/cpp/utility/any/any_cast
您可以在此处查看有关 C++ 标准的讨论:https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/ngSIHzM6kDQ
请注意,十多年来,Boost 一直以这种方式定义 any_cast
,而且它匹配 static_cast
和朋友。所以如果你想要一个参考,这样做:
any_cast<Foo&>(x)
与您在 C++ 中为较旧的 _cast
所做的相同。
我正在阅读 documentation for std::any_cast
,我发现奇怪的是 API 强制转换 return 持有对象的值或指向它的指针。为什么不 return 参考?每次使用非指针类型参数调用函数时都需要进行复制。
我可以看到指针版本的转换可能更能表达意图,也可能更清晰,但为什么不让值 returned 像这样作为参考呢?
template<typename ValueType>
ValueType& any_cast(any* operand);
而不是
template <typename ValueType>
ValueType* any_cast(any* operand);
此外,即使您请求引用,强制转换也会删除引用,并且 return 是存储对象的副本,请参阅函数重载 1-3 的 return 值的解释这里 http://en.cppreference.com/w/cpp/utility/any/any_cast
您可以在此处查看有关 C++ 标准的讨论:https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/ngSIHzM6kDQ
请注意,十多年来,Boost 一直以这种方式定义 any_cast
,而且它匹配 static_cast
和朋友。所以如果你想要一个参考,这样做:
any_cast<Foo&>(x)
与您在 C++ 中为较旧的 _cast
所做的相同。