【发布时间】:2017-12-20 17:00:05
【问题描述】:
作为this question 的后续,gcc 和 clang 都认为这个程序格式不正确:
int main() {
const int& ri = 0;
constexpr int i = ri;
}
错误是关于 ri 的值在常量表达式中不可用。 0 肯定是一个核心常量表达式,并且作为prvalue 核心常量表达式似乎满足these constraints(很简单,因为int 不是类、指针或数组类型)。那么ri不应该满足this criteria吗?
如果我使用类类型的纯右值文字也是如此:
struct X { };
int main() {
const X& rx = X{};
constexpr X x = rx;
}
【问题讨论】:
-
一个对象不能同时属于类、指针和数组类型。没有一个对象可以满足所有的约束。它必须满足适当的要求。
int类型的对象都不满足。所以不,ri不适用。 -
哦。感谢您让我意识到我误读了[expr.const]/6。它应该读取“具有静态存储持续时间的对象(不是临时对象或值满足上述约束的临时对象)”,而不是“(具有静态存储持续时间的对象不是临时对象)或(是一个临时对象,其值满足上述约束)”。
-
@StoryTeller 约束
P -> Q满足!P。 -
@Barry - 我读它更像
P1 || P2 || P3。在这种情况下,这三个都是相互排斥的。 -
引用被初始化为应用到右值
0调整为类型const int的临时实现转换的glvalue结果。您不能忽略转换而只考虑初始化程序的语法形式。
标签: c++ language-lawyer c++17