2015-06-20 47 views
4
#include <iostream> 

class dummy{ 
public: 
    constexpr 
     dummy(int one, int two) noexcept 
     :x(one),y(two){ 
    } 


    constexpr int getX() noexcept{ 
     return x; 
    } 

    constexpr int gety() noexcept{ 
     return y; 
    } 

    constexpr int operator+(const dummy& asd){ 
     return (this->getX() + asd.getX() + this->gety() + asd.gety()) ; 
    } 

private: 
    int x; 
    int y; 
}; 


int main(){ 
    constexpr dummy d1(2,4); 
    constexpr dummy d2(2,4); 

    int rand = 10; 
    std::cout<<d1+d2<<std::endl; 

    return 0; 
} 

根據我的理解,如果函數聲明爲constexpr,並且如果使用constexpr值,則可以在編譯時評估該函數。評價cout是否有constexpr值?

問題:

從這一行,因爲std::cout<<d1+d2<<std::endl;d1 + d2一個constexpr和cout算不算。 d1+d2將在編譯時進行評估?它會發生什麼事cout呢?我很擔心裏面發生了什麼。

+1

基本上,結果相當於'的std :: COUT << 12 <<的std :: ENDL;'可以在編譯時被計算D1 + d2'的'的值,但當然字符'」 1'和'2'只能在運行時寫入標準輸出。 –

回答

4

constexpr的評估是在編譯時評估的,而不是像您提到的那樣在運行時評估的。

因此,在您的示例中,以下語句在編譯時進行評估並初始化d1和d2。

constexpr dummy d1(2,4); 
constexpr dummy d2(2,4); 

而且在編譯的時候,它會使用operator重載函數的constexpr的總和

所以在運行時下面的語句打印編譯過程中已經計算表達式d1+d2的結果做d1d2總和時間。

std::cout<<d1+d2<<std::endl; 
+0

所以就像'cout'只會在運行時間等待? –

+0

是的,就是這樣 – Steephen