Первоначально являясь темой этого вопроса, выяснилось, что ОП просто упустил разницу. Между тем, этот ответ заставил меня и некоторых других подумать - почему это разрешено отбрасывать указатель на ссылку с помощью C-стиля или reinterpret_cast
?
int main() {
char c = 'A';
char* pc = &c;
char& c1 = (char&)pc;
char& c2 = reinterpret_cast<char&>(pc);
}
Вышеприведенный код компилируется без каких-либо предупреждений или ошибок (относительно приведения) в Visual Studio, в то время как GCC выдаст вам предупреждение, как показано здесь.
Моя первая мысль заключалась в том, что указатель каким-то образом автоматически разыменовывается (я обычно работаю с MSVC, поэтому я не получил предупреждения GCC) и пробовал следующее:
#include <iostream>
int main() {
char c = 'A';
char* pc = &c;
char& c1 = (char&)pc;
std::cout << *pc << "\n";
c1 = 'B';
std::cout << *pc << "\n";
}
С очень интересным выходом показано здесь. Таким образом, кажется, что вы обращаетесь к переменной с указателем, но в то же время вы этого не делаете.
Идеи? Объяснения? Стандартные кавычки?