gpt4 book ai didi

c++ - 为什么 GCC 对这些片段的处理方式不同?

转载 作者:IT老高 更新时间:2023-10-28 22:26:44 27 4
gpt4 key购买 nike

第一个片段编译时没有任何警告 (live example):

#include <iostream>

struct A {
constexpr A(): i(5){}
constexpr operator int() { return 5; }
int i;
};

int main() {
A a;
int b[a]{ 0, 1, 2, 3, 4 };
std::cout << b[4] << '\n';
}

现在通过在转换运算符 (live example) 中返回 i 来更改上述代码段:

constexpr operator int() { return i; }

GCC 警告 b 是一个 VLA。

对我来说,这两种变体似乎都符合 C++14 中的第 §5.19 [expr.const]/3 段。

最佳答案

您正在对 i 执行 l-t-r 转换,但为了不违反此处的 [expr.const]/(2.7),必须适用 (2.7.3):

enter image description here

(2.7.1) 涉及完整对象,(2.7.2) 讨论字符串字面量,(2.7.4) 涉及生​​命周期从表达式求值开始的对象 - 由于 a 的声明在 b 之前。

a定义为constexpr,代码合规。


一个小补充说明标准所说的内容:括号内的表达式必须是 std::size_t ([dcl.array]/1) 类型的转换常量表达式,它在 [expr.const]/4 中定义作为

A converted constant expression of type T is an expression, implicitly converted to type T, where the converted expression is a constant expression and […requirements that are met…]

因此,实际上,标准是否对

感兴趣
constexpr std::size_t s = a; 

将是有效的。由于上述原因,事实并非如此 - 尝试使用先前定义的非 constexpr 对象的子对象。

关于c++ - 为什么 GCC 对这些片段的处理方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397359/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com