2017-06-19 90 views
2

編寫基本類型的包裝,我從編譯器這個錯誤:爲什麼constexpr假設我的方法是const?

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

    constexpr Integer& operator++() 
    { 
     ++m_i;   // error: increment of member 'Integer::m_i' in read-only object 
     return *this;  // error: binding 'const Integer' to reference of type 'Integer&' discards qualifiers 
    } 

    int m_i; 
}; 

int main(int , char *[]) 
{ 
    Integer i = 0; 
    ++i; 
    ++i; 
    ++i; 
    return i.m_i; 
} 

編譯器假設我constexpr方法是const方法。爲什麼這樣?這是否意味着我的包裝永遠不會像原始類型那樣具有相同的性能/優化機會?我的意思是:

int main(int , char *[]) 
{ 
    int i = 0; 
    ++i; 
    ++i; 
    ++i; 
    return i; 
} 

會相比,我的這個代碼進行優化呢?

+8

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3598.html – NathanOliver

+0

@NathanOliver我不能相信他們在C++ 11中沒有考慮它。我啓用了C++ 14,現在編譯。 – nyarlathotep108

回答

0

簡單地說,constexpr更強形式const

+1

注意,這個論證從C++ 14開始就失敗了,其中'constexpr'方法不是隱式的'const'。 – Rakete1111

+0

你也可以有'constexpr const int foo' – Zereges

+0

@ Rakete1111啓用C++ 14而不是C++ 11,確實可以編譯代碼。謝謝 – nyarlathotep108

-1

提高性能使用關鍵字內嵌

constexpr讓你的對象不變

+0

類聲明中定義的函數(如我的示例代碼中)已經自動內聯。但這並不意味着它們將在編譯時進行評估,這就是我的意思。 – nyarlathotep108

相關問題