繁体   English   中英

constexpr函数及其参数

[英]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)是该6hello(6)是一个constexpr函数参数,而ihello(i)是一个普通的int参数。

如果您将i声明为constexpr int i = 6; ,则hello(i)将编译并执行。

hello(int(6)) ,您要说的是将整数6转换为int。 这是多余的操作。 hello(int(6))hello(6)将具有相似的行为,即使行为不相同。

bye()的工作原理,因为函数参数使用默认参数( j = 6constexpr int bye(int j = 6); )。 默认的初始化参数在编译时是已知的,因此根据定义是constexpr

这里要注意的是,编译器“验证”代码,而不“读取”代码。

编译器期望constexpr的所有部分在编译时都是已知的有效常量。 因此,尽管您和我从阅读代码中都知道i的值不会改变,但是除非您声明i为常数,否则编译器不会“知道”它。 就您而言,您可能已经在某处执行了其他代码来更改i的值。

在没有i的情况下调用函数的所有情况下,编译器毫无疑问地知道j的值是值为6的常量整数(注意: int(6)与仅6 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM