【问题标题】:Is there a standard C++ function, that is analogue to Address-of operator &?是否有一个标准的 C++ 函数,类似于地址运算符 &?
【发布时间】:2012-12-07 11:56:54
【问题描述】:

是否有一个标准的 C++ 函数,它类似于 Address-of 运算符 &,我可以将它用作带有 std::transform 和 std::compose1 等 stl 实体的函数对象?

【问题讨论】:

    标签: c++ stl functor memory-address


    【解决方案1】:

    std::addressof 可能适合您的目的。请注意,如果该类型具有该运算符的重载,则其行为与普通的 operator& 略有不同。

    【讨论】:

    • 你知道非 C++11 的方法吗?我需要 C++03。 中有一个地址。
    • @mezhaka 您可以推出自己的,具体取决于所需的功能。我的答案中的链接有一个可能的实现。
    • @juanchopanza:我是否遗漏了什么,或者在T 重载operator char & 的情况下,C 样式转换(char&) 是static_cast 是错误的实现? ideone.com/7aGun5
    • @juanchopanza:疯了,它在维基上。这是否意味着我应该修复它?
    • @SteveJessop 如果你确定,那么是的。如果不进一步阅读标准和一些实验,我没有足够的信心自己做。
    【解决方案2】:

    我想你要找的是std::addressof。

    【讨论】:

    • 因为这是一个函数而不是 AdaptableUnaryFunction,你可以用std::function 或std::ptr_fun 包装它,以便与compose1 一起使用。并不是说compose1 是标准的。
    • 你知道非 C++11 的方法吗?我需要 C++03。 中有一个地址。
    • @mezhaka:在 C++03 中,您只需编写自己的代码或使用 Boost。这并不复杂,诀窍就是通过转换为char&,获取地址,然后转换回T*,避免T 上的任何operator& 过载。如果您不需要“真实”地址(即您很乐意调用重载的operator&),那么它就更简单了:template <typename T> T* ampersand(T &t) { return &t; }。
    • @mezhaka:哦,是的,如果你自己写,你必须reinterpret_cast 到char&。不要 static_cast 或 C 样式转换,以防类也重载 operator char &。然后在处理 const 限定类型时会遇到一些麻烦(因为 reinterpret_cast 无法从引用中删除 cv 限定符)。即使这样,它仍然是单行的,只需查看 Boost 源代码。
    猜你喜欢
    • 2019-01-02
    • 2014-09-17
    • 2011-04-12
    • 1970-01-01
    • 2011-03-02
    • 2016-03-29
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多