Почему g ++ и MS Visual Studio C ++ по-разному выполняют следующий код? - PullRequest
9 голосов
/ 18 апреля 2011

У меня возникли проблемы с пониманием, кто виноват здесь (если есть). Следующий код представлен по-другому в 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 ++ временное значение типа const int* const создается из ptr. Но MSVS не создает ценности. И я не могу найти где-нибудь в стандарте c ++, который объясняет, что должно произойти, имеет ли результат неопределенное поведение или стандарт оставляет его на усмотрение компилятора. Так почему же g ++ и MS Visual Studio C ++ по-разному выполняют следующий код? Что должно произойти?

1 Ответ

8 голосов
/ 18 апреля 2011

Это связано с ошибкой Visual C ++, о которой я сообщал в прошлом году. Пожалуйста, сообщите об ошибке.

https://connect.microsoft.com/VisualStudio/feedback/details/615622/identity-cast-to-non-reference-type-violates-standard

(Связь здесь заключается в том, что ссылка связывается с const int*, что требует неявного преобразования из int *. Это преобразование должно формировать prvalue, то есть временное, но в VC ++ вместо этого оно формирует lvalue без создания копии .)

...