c++ - `std::any_cast` 返回拷贝

标签 c++ c++17 stdany

我正在阅读 documentation for std::any_cast我觉得很奇怪,API 让转换要么返回一个值给持有的对象,要么返回一个指向它的指针。为什么不返回引用?每次使用非指针类型参数调用函数时都需要创建一个拷贝。

我可以看到指针版本的转换可能更能表明意图,也可能更清晰,但为什么不让返回值成为这样的引用呢?

template<typename ValueType>
ValueType& any_cast(any* operand);

代替

template <typename ValueType>
ValueType* any_cast(any* operand);

此外,即使您请求引用,强制转换也会删除引用并将拷贝返回到存储的对象,请参阅此处对函数重载 1-3 的返回值的解释 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 和 friend 。因此,如果您需要引用,请执行以下操作:

any_cast<Foo&>(x)

与您在 C++ 中对较旧的 _cast 所做的相同。

关于c++ - `std::any_cast` 返回拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41905868/

相关文章:

c++ - 如何在CMake中分离头文件和源文件?

c++ - 调用 std::to_chars 的正确方法是什么?

C++:检查存储在 std::any 中的值是否是整数

c++ - 使用 rapidjson 读取子对象 vector

android - 查找/重新映射 OpenGL ES 坐标平面的边界

c++ - 在 C++ 中设置较低层级私有(private)字段的最佳实践

c++ - C++从类返回对 vector 中项目的引用

c++ - 通用重载运算符

c++ - 如何获取通用lambda的返回类型和参数类型?

c++ - 如何将参数包扩展为 vector <any>