Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ constexpr函数及其参数_C++_Constexpr - Fatal编程技术网

C++ constexpr函数及其参数

C++ constexpr函数及其参数,c++,constexpr,C++,Constexpr,hellow(i)和hello(6)之间有什么区别?我认为一个是intj=I和j不是constexpr,而另一个是int j=6和j仍然不是constexpr,两个j都是int类型。 int*literal!=constexpr,因此返回类型不是constexpr 我从书中的一个例子中得出了上述结论: int staff\u size=27//人员大小不是常量表达式 虽然staff_size是从一个文本初始化的,但它不是一个常量表达式 因为它是一个普通的int,而不是const int 此外,我

hellow(i)和hello(6)之间有什么区别?我认为一个是
intj=I
和j不是constexpr,而另一个是
int j=6
和j仍然不是constexpr,两个j都是
int
类型。
int*literal!=constexpr,因此返回类型不是constexpr

我从书中的一个例子中得出了上述结论:
int staff\u size=27//人员大小不是常量表达式

虽然staff_size是从一个文本初始化的,但它不是一个常量表达式 因为它是一个普通的int,而不是const int

此外,我注意到
hello(int(6))
也可以正常工作,这里的“东西”是什么

另外,
bye()
有效,而
hello(i)
无效,这两个参数都在函数内部初始化,只有一个参数具有默认值,这有什么意义

很困惑,希望有人能解释一下:D


PS:我不知道如何找到一个更好的标题,很抱歉,

你好(6)和你好(i)之间的区别在于
hello(6)
中的
6
是一个
constexpr
函数参数,而
hello(i)
中的
i
是一个常规的
int
参数

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

hello(int(6))
中,您说的是将整数文本转换为int。这是一个冗余操作
hello(int(6))
hello(6)
将具有类似的行为,如果不是相同的话


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

hello(6)
hello(i)
之间的区别是
hello(6)
中的
6
constepr
函数参数,而
hello(i)中的
i
是一个常规的
int
参数

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

hello(int(6))
中,您说的是将整数文本转换为int。这是一个冗余操作
hello(int(6))
hello(6)
将具有类似的行为,如果不是相同的话


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

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

编译器希望constexpr的所有部分在编译时都是已知的有效常量。因此,尽管您和我通过阅读代码知道,
I
的值永远不会改变,但编译器不会“知道”它,除非您将
I
声明为常量。就这一点而言,您可以在某处执行其他代码来更改
i
的值


在所有不使用
i
调用函数的情况下,编译器无疑知道
j
的值是一个常量整数,值为
6
,(注意:
int(6)
6
相同)。

这里需要注意的是编译器“验证”了代码,它不“读”它

编译器希望constexpr的所有部分在编译时都是已知的有效常量。因此,尽管您和我通过阅读代码知道,
I
的值永远不会改变,但编译器不会“知道”它,除非您将
I
声明为常量。就这一点而言,您可以在某处执行其他代码来更改
i
的值


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

常量扩展传播
6
是常量,
i
不是常量。如果你没有修改它,那还不够,你需要声明它。
int
literal是一个常量表达式。而
int(6)
int
literal
6
(两者都是右值)具有相同的语义。@passer如果它真的是“传播的”。那为什么这不起作用呢<代码>常量表达式int j1=6;int q=j1;constexpr int j2=q应该没问题,因为j1的constexpr传播到q,那么q应该能够初始化另一个constexpr。这是松散的说法。我的意思是constexpr函数有constexpr值,如果它的参数是constexpr<代码>q由常量初始化并不意味着q`是一个常量
6
是常量,
i
不是常量。如果你没有修改它,那还不够,你需要声明它。
int
literal是一个常量表达式。而
int(6)
int
literal
6
(两者都是右值)具有相同的语义。@passer如果它真的是“传播的”。那为什么这不起作用呢<代码>常量表达式int j1=6;int q=j1;constexpr int j2=q应该没问题,因为j1的constexpr传播到q,那么q应该能够初始化另一个constexpr。这是松散的说法。我的意思是constexpr函数有constexpr值,如果它的参数是constexpr
q由常量初始化并不意味着
q`是常量
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;
}