[decl.constexpr].5 到底是什么意思?
What does [decl.constexpr].5 mean exactly?
constexpr 函数的标准在 [decl.constexpr] 的第 5 点下声明:
对于非模板、非默认的 constexpr 函数或非模板、非默认、非继承的 constexpr 构造函数,如果不存在参数值,使得函数或构造函数的调用可能是核心常量表达式 (5.19( 的计算子表达式,则程序格式不正确;无需诊断。
它继续给出以下示例:
constexpr int f(bool b){ return b ? throw 0 : 0; } // OK
constexpr int f() { return f(true); } // ill-formed, no diagnostic required
我从中得出的结论是,具有空参数列表的函数是无诊断格式错误的。这让我觉得非常奇怪,以至于我怀疑我的理解是不正确的。例如,这是否也是格式不正确的:
constexpr int g() { return 0; } // ill-formed?
如果是这样,这背后的理由是什么,如果不是,限定意味着什么/constexpr函数何时变得格式不正确?
想必以下都没问题?
constexpr int h(int x) { return x; } // presumably fine?
constexpr int l = h(42); // also fine
此规则的基本原理是,至少应该有一个上下文可以在constexpr
上下文中评估函数。 例如:
constexpr int f(bool b){ return b ? throw 0 : 0; } // OK
constexpr int f() { return f(true); } // ill-formed, no diagnostic required
无法在constexpr
上下文中调用f()
,因为通过此函数的所有路径都将以不是核心常量表达式的表达式结尾。
编译器必须评估所有可能的调用,以查看是否有任何方法可以在constexpr
上下文中使用函数。这通常不容易诊断,因此该语言说它是格式不正确的,不需要诊断,即您做错了什么,但编译器无法诊断它。
请注意,如果f
的零参数重载如下:
constexpr int f() { return f(false); } // ok
这完全没问题,因为评估以核心常量表达式结束。
同样,此函数:
constexpr int g() { return 0; } // ok
以及这个:
constexpr int h(int x) { return x; } // ok
constexpr int l = h(42); // ok
很好,因为可以在constexpr
上下文中调用g
和h
。
"...如果不存在这样的参数值......">可能会令人困惑,因为您已经询问了g
的格式良好。但是g
可以用零参数调用,或者换句话说,可以用void
参数调用,所以没关系。
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 在命名空间名称之前加上 :: 是什么意思?
- 从字符数组的元素中减去'a'是什么意思
- "friend"关键字在C++中是什么意思?
- 减法中的"0"是什么意思?
- 字符数组前面的加号是什么意思?
- 这里的字符串函数是什么意思