函数声明返回一种类型,实际上返回另一种类型

Fed*_*dor 6 c++ visual-c++ compiler-bug

我几乎可以肯定以下是 Visual Studio 编译器的错误,但很难相信我决定在这里仔细检查:

struct A {
    constexpr virtual int f() { return 0; }
};

struct B : A {
    constexpr auto f() { return 1.1; }
};

constexpr int g() {
    B b;
    A & a = b;
    return a.f();
}

static_assert( g() != 1 );
static_assert( g() == 1.1 );
Run Code Online (Sandbox Code Playgroud)

g()声明为返回int类型的函数通过编译时检查g() == 1.1意味着g()实际上返回一个double值。此行为在最新的 MSVC 编译器中可以重现,在线演示: https: //gcc.godbolt.org/z/6sGET7773

由于B::f()声明不能包含auto返回类型,程序是否存在格式错误?