Позволяет ли GCC/Clang получить доступ к статическому члену через нулевой указатель?
#include <iostream>
struct Foo { static auto foo() -> int { return 123; } };
int main() {
std::cout << static_cast<Foo*>(nullptr)->foo() << std::endl;
return 0;
}
Я ЗНАЮ, что это не разрешено стандартом. Но как насчет конкретного компилятора?
Меня волнуют только GCC(G++) и Clang.
Есть ли какая-либо гарантия того, что эти два компилятора позволят это как функцию / спецификацию / расширение компилятора?
2 ответа
Я не могу найти это ни в списке расширений C++ для gcc, ни в соответствующем списке для clang. Поэтому я бы сказал, что у вас нет гарантии, что это работает для любого компилятора.
Ничто не говорит о том, что это будет работать. От вас зависит, решите ли вы использовать его, чтобы убедиться, что он действительно работает для той архитектуры, в которой вы его используете. И важно учитывать тот факт, что генерация кода, отладочные ловушки для использования нулевого указателя (и тому подобное) и оптимизация во всех компиляторах "зависят от целевой системы" - так что это может хорошо работать на x86, но не на MIPS, как пример, Или он может перестать работать так или иначе в версии X+0.0.1 компилятора.
Сказав это, я ожидаю, что этот конкретный пример будет отлично работать на любой архитектуре, потому что this
нигде не используется.
Обратите внимание, что то, что что-то не определено, не обязательно означает, что оно будет аварийно завершаться, отказывать или даже "работать не так, как вы ожидаете". Тем не менее, он позволяет компилятору генерировать любой код, который ему нужен, включая что-то, что взрывает ваш компьютер, форматирует жесткий диск и т. Д., И т. Д.