【发布时间】:2018-05-22 12:06:22
【问题描述】:
constexpr 函数定义为 (c++14)
constexpr 函数必须满足以下要求:
- 不能是虚拟的
- 它的返回类型必须是 LiteralType 它的每个参数都必须是 LiteralType
- 至少存在一组参数值,因此函数的调用可以是 核心常量表达式(对于构造函数,在常量中使用 初始化程序就足够了)(C++14 起)。无需诊断 违反此项目符号。
函数体必须被删除或默认或包含任何 语句除外:
- asm 声明
- goto 语句
- 带有除 case 和 default 之外的标签的语句
- 一个尝试块
- 非文字类型变量的定义
- 静态或线程存储持续时间变量的定义
- 未对其执行初始化的变量的定义。
现在下面的func1满足要求并编译
constexpr int * func1 (int a)
{
int b = 4;
return &b;
}
int main()
{
constexpr int * a = func1(3);
int arr[*a];
std::cout << a << std::endl;
}
现在我的问题是 func1 怎么是 constexpr。它如何在编译时知道局部变量的地址?
我使用的是 gcc 6.4.0
【问题讨论】:
-
我认为您在将第三个项目符号(“至少存在一组参数值......”)解释为满足时可能过于松懈。
-
我的问题仍然有效。编译器如何在编译时知道局部变量的地址(与参数值无关)?
-
func1 不是 constexpr!
-
你的问题只有在满足所有项目符号的前提下才有效。由于第三个可能不是,并且这种情况不需要诊断,因此答案是在最坏的情况下您会得到未定义的行为。
-
请帮助理解这一点。第三个子弹说至少一组论点?无参数组合 make function constexpr.