Мне трудно понять, какой компилятор здесь виноват (если таковой имеется). Следующий код выполняется иначе для 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 ++ по-разному выполняют следующий код? Что должно произойти?