#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}}会发生什么?我担心里面发生了什么。
答案 0 :(得分:4)
constexpr
在编译时进行评估,而不是像你提到的那样在运行时进行评估。
因此,在您的示例中,以下语句在编译时进行评估,并初始化d1和d2。
constexpr dummy d1(2,4);
constexpr dummy d2(2,4);
在编译时,它会使用d1
运算符重载函数对d2
和constexpr
求和进行求和
因此,在运行时跟随语句打印已在编译期间计算的表达式d1+d2
的结果。
std::cout<<d1+d2<<std::endl;