constexpr 函数和硬编码参数
constexpr function and hardcoded arguments
所以通常constexpr函数是在编译时执行的函数,当传递给它的参数也是constexpr
时,如下所示:constexpr int function(int x, int y){
return x+y;
}
参数声明如下:
constexpr int x = 5;
constexpr int y = 6;
将在编译时执行,但具有以下参数声明:
int x=5;
int y=6;
不会的。我想知道如果我们通过以下方式调用这个函数会发生什么:
function(5,6);
从技术角度来看,5 和 6 是右值,但没有办法(我猜(它们可以转换为 constexpr(如果我们可以笼统地说到 constexpr(,所以在我看来它将在运行时执行。但是,没有实际的理由在运行时执行它,因为在编译期间 x 和 y 都是已知的。
所以我的问题是它在现实生活中怎么样?此函数是在运行时还是编译时执行
constexpr int fun(int x, int y) { return x+y; }
fun(5,6) // << constant expression?
博士
5
和6
是常量表达式。因此,fun(5,6)
也是一个常量表达式,并将在编译时进行计算,这是必需的(例如非类型模板(。
东西。。。我快速浏览了标准,我希望我没有错过任何重要点。
我们已经从@42的回答中知道:
根据 N4527,
int
是 constexpr 函数的有效参数类型,因为它是文本类型(因为它是标量类型,根据同一文档的 §3.9/10 是文本类型(。因此,fun
是一个有效的 constexpr 函数。它提供了将
fun(5,6)
放入需要常量表达式并且似乎被某些编译器接受的上下文中的代码。
现在的问题是,这是否是有效的、符合标准的行为。
§5.20 从 N4527 说:
条件表达式 e 是核心常量表达式,除非按照抽象机器 (1.9( 的规则对 e 进行计算,否则将计算以下表达式之一:
- 这里有一大堆阻止表达式成为核心常量表达式的东西
该列表不包含"带有常量表达式参数的constexpr函数",因此它们是核心常量表达式(除非它们在使用时未定义(。
因此,如果 5
和 6
是常量表达式,那么如果 fun
是一个有效的 constexpr 函数并且在使用它之前被定义,则fun(5,6)
是一个常量表达式。给定的函数满足 §7.1.5/3 中的必要约束,并且是一个有效的 constexpr 函数。
5
和 6
都是 §2.13.2 中 int
类型的整数文本
1( 整数文字是没有句点或指数部分的数字序列,可选的分隔单引号在确定其值时被忽略。[...]
2( 整数文本的类型是表 5 中相应列表中的第一个,可以在其中表示其值。
后缀:
none
,十进制文字:int
,long int
,long long int
现在再看§5.20,我们看到:两者都是常量表达式。
根据草案标准 N4527 7.1.5/3 constexpr 说明符 [dcl.constexpr](强调我的(:
constexpr 函数的定义应满足以下条件 约束:
(3.1( — 它不应是虚拟的 (10.3(;
(3.2( — 其返回类型应为文字类型;
(3.3( — 其每个参数类型应为文字类型;
。
因此,调用function(5,6);
满足constexpr
函数的定义,并在编译时执行。
此外,您可以使用 std::integral_constant 自行测试:
#include <iostream>
#include <type_traits>
constexpr int fun(int x, int y) {
return x + y;
}
int main() {
std::cout << std::integral_constant<int, fun(5, 6)>::value << std::endl;
}
现场演示
如果fun
中的输入参数未constexpr
则编译将失败。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 在卡萨布兰卡形成编码参数的列表
- 如何对要用于模板参数的类型列表进行编码
- 如何在 C/C++ 中使用用户定义的参数对库进行编码
- terminfo参数化字符串%d的编码行为
- 通过c++主字符**参数处理不同字符串编码的正确方法是什么
- 硬编码参数与从文件加载
- 如何判断参数何时来自硬编码数字
- constexpr 函数和硬编码参数
- 获取url参数值以某种格式编码
- 将命令行参数从Java传递到c++编码
- 面试编码-将指向节点结构的指针作为参数,并返回传入数据结构的完整副本
- 通过输出参数返回结果,c++编码标准
- 是否有任何语法硬编码向量作为参数
- 删除函数定义中未使用的参数名称(编码标准)
- 我怎么能得到QT主函数argv参数作为unicode编码格式