2017-10-13 31 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

相關問題