[英]constexpr function and its parameter
constexpr int hello(int j) {
return j * 12;
}
constexpr int bye(int j = 6) {
return j * 12;
}
int main() {
int i = 6;
constexpr int a1 = hello(i); //error
constexpr int a2 = hello(6); //ok
constexpr int a3 = hello(int(6)); //ok
constexpr int a4 = bye(); //ok
constexpr int a5 = bye(i); //error
constexpr int a6 = bye(6); //ok
return 0;
}
hellow(i)
和hello(6)
什么区别? 我认为是int j = i;
并且j不是constexpr,而另一个是int j = 6
并且j仍然不是constexpr,两个j都是int
类型。
int *文字!= constexpr ,因此返回类型不是constexpr。
我从书中的一个例子得到了上述结论:
int staff_size = 27; //staff_size is not a const expression
尽管staff_size是从文字中初始化的,但它不是常量表达式,因为它是普通int,而不是const int。
而且,我注意到hello(int(6))
可以正常工作,这里的“内容”是什么?
另外, bye()
可以工作而hello(i)
不能工作,两个参数都在函数内部初始化,只有一个具有默认值,这有什么意义?
很困惑,希望有人可以解释:D
PS:不知道要找到一个更好的标题,对此感到抱歉
之间的差hello(6)
和hello(i)
是该6
在hello(6)
是一个constexpr
函数参数,而i
在hello(i)
是一个普通的int
参数。
如果您将i
声明为constexpr int i = 6;
,则hello(i)
将编译并执行。
在hello(int(6))
,您要说的是将整数6
转换为int。 这是多余的操作。 hello(int(6))
和hello(6)
将具有相似的行为,即使行为不相同。
bye()
的工作原理,因为函数参数使用默认参数( j = 6
在constexpr int bye(int j = 6);
)。 默认的初始化参数在编译时是已知的,因此根据定义是constexpr
这里要注意的是,编译器“验证”代码,而不“读取”代码。
编译器期望constexpr的所有部分在编译时都是已知的有效常量。 因此,尽管您和我从阅读代码中都知道i
的值不会改变,但是除非您声明i
为常数,否则编译器不会“知道”它。 就您而言,您可能已经在某处执行了其他代码来更改i
的值。
在没有i
的情况下调用函数的所有情况下,编译器毫无疑问地知道j
的值是值为6
的常量整数(注意: int(6)
与仅6
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.