代码之家  ›  专栏  ›  技术社区  ›  Maarten Bamelis

当仅在constexpr/编译时上下文中操作时,引用是否有用?

  •  2
  • Maarten Bamelis  · 技术社区  · 8 年前

    我正在探索 constexpr 并决定创建一个只应在constexpr上下文和其他编译时构造中使用的类。

    通常,我会非常小心地提供类可能需要的所有必要重载,例如:

    template <typename T>
    struct Thing
    {
        Thing(T value) : m_value(value) {}
    
        T &value() & { return m_value; }
        const T &value() const & { return m_value; }
    
        T &&value() && { return std::move(m_value); }
    
    private:
        T m_value;
    };
    

    的重载集 Thing::value 应注意有效访问存储值,不制作不必要的副本。如果 Thing 实例是临时的,存储的值甚至可以移出。

    但是如果 事情 仅用作constexpr类型,所有这些不同的重载对于 事物::价值 需要还是有帮助?或者以下是等效的:

    template <typename T>
    struct Thing
    {
        constexpr Thing(T value) : m_value(value) {}
    
        constexpr T value() const;
    
    private:
        T m_value;
    };
    

    我的问题基本上可以归结为: 当仅在constexpr/编译时上下文中操作时,引用是否有用(更有效);还是按价值传递一切?

    1 回复  |  直到 8 年前
        1
  •  3
  •   skypjack    8 年前

    我的问题基本上归结为:当仅在constexpr/编译时上下文中操作时,引用是否有用(更高效);还是按价值传递一切?

    问题在于你的实际问题是什么,以及你计划如何解决它。在大多数情况下(全部?)我同意,在这种情况下,您不需要使用引用,但如果需要,您仍然可以使用它们。

    这里是一个最小的工作示例:

    const int i = 0;
    
    template <typename T>
    struct Thing {
        constexpr Thing(const T &value) : m_value(value) {}
        constexpr const T & value() const { return m_value; }
    
    private:
        const T & m_value;
    };
    
    int main() {
        static_assert(Thing<int>{i}.value() == 0, "!");
    }
    

    看到它并继续运行 wandbox .

    参考资料有用吗(效率更高)
    如果您的问题需要您使用参考资料,它们会为您提供(请与我联系-我只是想知道这是什么问题!)。否则,请继续按价值传递。