【发布时间】:2021-10-13 18:35:32
【问题描述】:
令我惊讶的是,gcc 11.2 accepts this code,但仅限于 C++20 模式:
struct Base {};
struct Derived : Base { int i; };
int f(Base& b) { return static_cast<Derived>(b).i; }
// ^~~~~~~ oops, forgot the `&`
同样,MSVC 19.29 在 C++20 模式下接受它,在 C++17 模式下拒绝它,但即使在 C++20 模式下,clang 也会拒绝它。
查看汇编器输出,f 总是返回0,因此它忽略了传递给f 的任何潜在Derived 的实际数据。
这是 UB,还是在 C++20 中合法,如果是,为什么?
【问题讨论】:
标签: c++ language-lawyer c++20 downcast static-cast