C++ constexpr函数及其参数
hellow(i)和hello(6)之间有什么区别?我认为一个是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 此外,我
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
literal6
(两者都是右值)具有相同的语义。@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
literal6
(两者都是右值)具有相同的语义。@passer如果它真的是“传播的”。那为什么这不起作用呢<代码>常量表达式int j1=6;int q=j1;constexpr int j2=q代码>应该没问题,因为j1的constexpr传播到q,那么q应该能够初始化另一个constexpr。这是松散的说法。我的意思是constexpr函数有constexpr值,如果它的参数是constexprq由常量初始化并不意味着
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;
}