странное поведение dynamic_cast, когда целевая переменная имеет то же имя, что и исходная переменная - PullRequest
0 голосов
/ 28 апреля 2020
#include <iostream>
#include <string>

using namespace std;

struct Foo {
    virtual ~Foo() = default;
    int foo = 321;
};

struct Bar: public Foo {
    int bar = 123;
};

int main() {
    const Foo* ptr = new Bar();
    std::cout << ptr << std::endl;
    {
        const Bar* ptr = dynamic_cast<const Bar*>(ptr);
        std::cout << ptr << std::endl;
    }
    {
        const Bar* ptr2 = dynamic_cast<const Bar*>(ptr);
        std::cout << ptr2 << std::endl;
    }
    return 0;
}

программа выводит следующие строки, если скомпилировано с -O2:

0x613c20
0
0x613c20

и если без -O2, это похоже на:

0x614c20
0x400b70
0x614c20

В обоих случаях вторая строка выглядит проблемной c, когда имя целевой переменной конфликтует с именем исходной переменной dynamic_cast. Я попробовал оба g cc 4.8 и 5.2, а также лязг 11.0.3.

Кто-нибудь знает об этом?

...