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

C++ 仅在constexpr/编译时上下文中操作时,引用是否有用?,c++,reference,constexpr,C++,Reference,Constexpr,我正在探索的世界,并决定创建一个只应在constexpr上下文和其他编译时构造中使用的类 通常,我会非常小心地提供类可能需要的所有必要重载,例如: template <typename T> struct Thing { Thing(T value) : m_value(value) {} T &value() & { return m_value; } const T &value() const & { return m_

我正在探索的世界,并决定创建一个只应在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;
};

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

我的问题基本上归结为:当仅在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, "!");
}
const int i=0;
模板
结构物{
constexpr Thing(constt&value):m_值(value){}
constexpr const T&value()const{return m_value;}
私人:
常量T&m_值;
};
int main(){
静态断言(Thing{i}.value()==0,“!”;
}
看到它启动并继续运行

那么,在这种情况下,引用是否有用(更有效)?好吧,这不是效率的问题。要在这样的上下文中使用引用,您必须有充分的理由,而且该语言设置了很多限制。他们解决了一个特定的问题,决定使用参考文献不是你的爱好。

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

引用在编译时有意义吗?引用是内存中某个对象的句柄,但如果只在编译时对其求值,那么我会认为它没有什么区别。至少作为一个例子,该标准允许您使用它们作为模板参数,但有一些限制。我认为在编译时使用引用可能是解决某些问题的一个必要条件。我的问题不需要它们(幸运的是)。我在问题中特别提到了效率,因为不知何故,我认为使用引用而不是值可能会缩短编译时间?@MaartenBamelis我认为您不会注意到这两种情况的差异。
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, "!");
}