2017-04-24 49 views
0

以下代碼顯示如何使用constexpr operator++()(預增量)(live demo)。現在我想知道是否有什麼用於宣佈後增量運算符爲constexpr。我認爲這樣的操作員沒有副作用,並且以與示例中類似的方式使用。 (如果這是過於抽象。我打算延長我的bitset2類,並想知道是否會有任何好處,如果遞​​增運算符是constexpr是否有任何constexpr操作符的應用程序++(int)(後遞增)

struct S { 
    constexpr S(int i) : m_i(i) {} 
    constexpr S & operator++() { 
     ++m_i; 
     return *this; 
    } 
    int m_i; 
}; 

int main() { 
    constexpr auto s1= ++S{3}; 
    std::cout << s1.m_i << '\n'; // output: 4 
} 

回答

2

是的,它有一個應用程序:定義後增量操作符可以用於編寫constexpr函數。考慮以下幾點:

tempalte<std::size_t N> 
constexpr std::array<baz,N> foo(){ 
    std::array<baz,N> bar; 
    baz i; 
    for(auto&& item: bar) { 
     item = i++; 
    } 
    return bar; 
} 

在上述的例子將在編譯時通過constexpr被填充的陣列bar。假設類型baz是某種形式的計數器,增量的操作順序(前/後)可能很重要。

需要記住的是constexpr是一個表達式,不僅僅是一個值。允許在constexpr中進行復雜計算(在constexpr的規則內)。從理論上講,你可以完全編寫許多程序作爲constexpr(儘管我並不是說這將是一個好主意)。

+0

'return bar;'。爲什麼你在循環中加倍引用'item'?你沒有移動任何東西...... – JHBonarius

+1

@ J.H.Bonarius修復了缺失的返回語句。不,我沒有移動任何東西,但基於範圍的循環正在生成一個臨時通過解引用我通過r值參考捕獲的迭代器而不是複製該值。它可以用其他幾種方式書寫。 –

+0

是的,你的例子說服我。我將它應用到我最初的例子([link](https://wandbox.org/permlink/6k8Vuq1rVl0yM1M9))。刪除後綴增量操作符的'constexpr'將不會編譯。 –

0

我不知道這是否是有用的,但你可以複製在後增量一個

可編譯比如你的增量預例如

#include <iostream> 

struct S 
{ 
    constexpr S (int i) : m_i{ i } 
    { } 

    constexpr S & operator++() 
    { 
     ++m_i; 
     return *this; 
    } 

    constexpr S operator++ (int) 
    { 
     S ret { this->m_i ++ }; 
     return ret; 
    } 

    int m_i; 
}; 

int main() 
{ 
    constexpr S s1 { ++S{3} }; 
    constexpr S s2 { S{4}++ }; 

    static_assert(s1.m_i == s2.m_i, "!"); 
} 

以及帶constexpr運營商,你可以寫constexpr功能

constexpr S foo (int a, int b) 
{ 
    S s1 { a }; 
    S s2 { b }; 

    bool test { (s1++).m_i == (++s2).m_i }; 

    return test ? s1 : s2; 
} 
+1

重複邏輯不是一個好主意 - 你只需要調用'operator ++()'。 – Barry

+0

@Barry - 我知道,但通過這種方式推理,你可以簡單地用一個遞增的值來構造'S'('constexpr auto s1 = S {4};')。這是一個constexpr預增量操作符嗎?無論如何,我已經添加了另一個基於功能的(但有用的?)示例。 – max66

相關問題