Почему g ++ и MS Visual Studio C ++ выполняют следующий код иначе?

Мне трудно понять, какой компилятор здесь виноват (если таковой имеется). Следующий код выполняется иначе для g ++ по сравнению с MS Visual Studio C ++.

#include <iostream>

int main() {

    int a = 10; //some random value

    int* ptr = &a;

    //a temp rvalue of type `const int* const' created in g++
    //no temp created in MS Visual Studio
    const int* const &alias_for_ptr = ptr;

    ptr = 0; //null ptr

    if (ptr == alias_for_ptr)
        //This will execute in MS Visual Studio C++
        //But not in g++
        std::cout << "ptr == alias_for_ptr" << std::endl;
    else
        //This will execute in g++
        //But not in MS Visual Studio C++
        std::cout << "ptr != alias_for_ptr" << std::endl;

    return 0;

}

Теперь я полагаю, что проблемная строка -

const int* const &alias_for_ptr = ptr;

, а в g ++ создается временное rvalue типа const int * const от птр. Но MSVS не создает rvalue. И я не могу найти нигде в стандарте С ++, разъясняющего, что должно произойти, имеет ли результат неопределенное поведение или стандарт оставляет это на усмотрение компилятора. Так почему же g ++ и MS Visual Studio C ++ по-разному выполняют следующий код? Что должно произойти?

9
задан Mark B 18 April 2011 в 04:31
поделиться