如果它具有constexpr值,评估cout?

时间:2015-06-20 21:06:05

标签: c++ c++11

#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值,则可以对其进行评估。

问题:

从这一行开始,std::cout<<d1+d2<<std::endl; d1 + d2因为d1+d2是constexpr而cout运算符不是。cout是{{1}}是否会在编译时进行评估?周围的{{1}}会发生什么?我担心里面发生了什么。

1 个答案:

答案 0 :(得分:4)

constexpr在编译时进行评估,而不是像你提到的那样在运行时进行评估。

因此,在您的示例中,以下语句在编译时进行评估,并初始化d1和d2。

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

在编译时,它会使用d1运算符重载函数对d2constexpr求和进行求和

因此,在运行时跟随语句打印已在编译期间计算的表达式d1+d2的结果。

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