在定义失败之前使用constexpr函数
Use of constexpr function before definition fails
我在constexpr
上遇到了一些问题。C++初级读本显示了一行代码:
constexpr int sz = size(); // only size() is a constexpr function
// this code is right
然而,这本书并没有给出具体的例子。所以我自己尝试以下代码:
#include <iostream>
constexpr int fun();
int main()
{
constexpr int f = fun();
std::cout << f << std::endl;
}
constexpr int fun()
{
return 3;
}
但是我的编译器说fun()
是未定义的。
如果我将constexpr
更改为const
,它工作得很好,如果我在使用之前更改代码以定义constexpr函数:
#include <iostream>
constexpr int fun()
{
return 3;
}
int main()
{
constexpr int f = fun();
std::cout << f << std::endl;
}
它也运行良好。有人能告诉我为什么吗?
constexpr
函数在首次使用之前不必定义,但是在定义之前进行的任何调用的结果都不是常量表达式。
来源:C++标准草案n4296,第5.20节:
条件表达式
e
是核心常量表达式,除非e
的求值遵循抽象机的规则,将求值以下表达式之一:
this
,除了在作为e
的一部分而被评估的constexpr
函数或constexpr
构造函数中- 对文字类的
constexpr
构造函数以外的函数的调用、constexpr
函数的调用或对平凡析构函数的隐式调用[注意:重载解析应用为普通——尾音]- 调用未定义的
constexpr
函数或未定义的constexpr
构造函数
草案3485的版本(第5.19节):
条件表达式是核心常量表达式
this
[注意:在计算常量表达式时,函数调用替换将constexpr
成员函数中每次出现的this
替换为指向类对象的指针。--结束注释]- 对文字类或
constexpr
函数的constexpr
构造函数以外的函数的调用[注意:重载解析照常应用--结束注释]- 调用未定义的
constexpr
函数或未定义的constexpr
构造函数
n2235中的示例int x2 = s. t();
实际上由于在标准化之前所做的更改而变得有效。但是,constexpr int x2 = s. t();
仍然是一个错误。
相关文章:
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- constexpr 函数获取常量字符*
- 如何在 constexpr 函数中实现回退运行时
- 在非 constexpr 函数中作为左值传递的变量上使用 'constexpr' 函数
- NVCC 错误:string_view.h:constexpr 函数返回是非常量
- constexpr函数中的静态constexpr变量
- 在 constexpr 函数中断言
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- constexpr 函数的常量引用参数:gcc/msvc vs clang/icc
- constexpr 函数在编译时获取值,即使我的变量不是 constexpr
- 如何正确地对 constexpr 函数进行单元测试
- 为什么 std::launder 是一个 constexpr 函数?
- 我可以使用 constexpr 函数声明一个静态数组吗?
- 用于连接向量的 Constexpr 函数
- 在非constexpr函数上添加的constexpr限定符不会触发任何警告
- 为什么 std::get<T> 其中 T 是调用 constexpr 函数失败的结果?
- 在constexpr函数中插入许多模板
- 在enable_if_t中调用 constexpr 函数
- constexpr 函数中的 for 循环无法使用 MSVC 19.23 进行编译