2017-10-13 64 views
2

我正在探索constexpr的世界,并决定创建一个只应用于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实例是临时的,则存储的值甚至可以移出。

但是如果Thing只能用作constexpr类型,那么Thing::value所需的所有这些不同的重载是甚至是有用的呢?或将以下相当于:

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

    constexpr T value() const; 

private: 
    T m_value; 
}; 

我的问题基本上可以归结为:是引用帮助的(更有效)的constexpr运行时/编译时上下文只;还是以等值的价值传递一切东西?

+1

在编译时参考文献是否合理?一个引用是一个对象在内存中的句柄,但由于它只在编译时进行评估,所以我认为它没有区别 –

+0

[参考文献在编译时实际上是有意义的](http://coliru.stacked-crooked的.com /一个/ c1676d70db7cd413)。至少和作为一个例子,标准允许你使用它们作为模板参数,但有一些限制。 – skypjack

回答

3

我的问题基本上归结为:仅在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运行。

那么,在这种情况下是有用的(更有效率)?那么,这不是一个效率或任何问题。要在这样的背景下使用引用,你必须有一个很好的理由,并且这种语言设置了很多限制。他们解决了一个特定的问题,决定使用引用不是你的口味。
如果您的问题需要您使用参考,他们在那里为您(请与我联系 - 我只是想知道那是什么问题!)。否则,请随时继续传递价值。

+0

我发现在编译时使用引用可能是解决某些问题的必要条件。我的问题并不需要他们(幸运的是)。我在我的问题中特别提到了*效率*,因为不知何故,我认为使用引用而不是值可能会缩短编译时间? –

+0

@MaartenBamelis我不认为你会注意到在任何情况下的差异。 – skypjack

相关问题