gcc和clang在表达式是否为常量求值的问题上存在分歧
gcc and clang disagree on whether expression is constant evaluated
对于以下程序:
struct S { int i; };
constexpr S f() {
return std::is_constant_evaluated() ? S{1} : S{0};
}
int main() {
S s = f();
return s.i;
}
gcc返回0,clang返回1。演示
我不认为f
的评估是在需要不断评估的环境中进行的,所以我认为clang在这里是错误的。还是相反?或者两个结果都有效?
我们要寻找的要求是,如果一个表达式的求值结果明显为常量,这在[expr.const]/14中定义,即:
- 一个常量表达式,或
- constexpr-if语句([stmt.if](的条件,或
- 立即调用,或
- 代入原子约束表达式以确定是否满足的结果([temp.contr.atomic](,或
- 在常量表达式中可用或具有常量初始化的变量的初始值设定项
这些条件中的前四个显然不成立。
对于最后一个,我们的变量在常量表达式中不可用,因为它既不是constexpr,也没有const限定的积分/枚举类型。这就是第五个条件的前半部分。
对于最后一个的最后一部分,我们需要确定是否有常量初始化(不要与常量初始化混淆(。这个定义在[basic.start.static]/2中,强调我的:
如果具有静态或线程存储持续时间的变量或临时对象被常量初始化([expr.const](,则执行常量初始化。
但是s
是而不是一个具有静态或线程存储持续时间的变量,因此没有常量初始化,因此最后一个条件的最后一部分也不成立。
因此,这些条件都不成立,并且在OP中,std::is_constant_evaluated()
应该返回false
,这是一个clang错误。
相关文章:
- C++quit()函数中可能存在作用域问题
- 这个极客对极客的trie实现是否存在内存泄漏问题
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- C++Builder中的OnClick事件签名存在问题
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- C++ 中的函数 GetCursorPos() 和 SetCursorPos() 存在一些问题
- 在 C++ 中使用逗号的 echo 命令中存在问题
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 将文件复制到自定义位置,存在字符串转换问题
- 构造函数 (C++) 中的 char 指针参数存在问题
- 在 boost::variant 中类 holden 的复制构造函数存在问题
- 具有sleep_for和sleep_until功能的 gcc 可能存在的问题
- 用户定义的文本运算符(在原始模式下)存在问题
- 以下代码中存在哪些问题?
- 这种比较是否不一致(或者存在其他问题)?
- C++中的数组存在问题
- 用于检测函数是否存在的C++元函数的问题
- 以下代码存在哪些问题?
- 我的选择排序代码是否存在导致它跳过数组中的元素的问题?