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.

Есть ли какая-либо гарантия, что эти два компилятора позволят это как функцию / спецификацию / расширение компилятора?

0

Решение

Я не могу найти это ни в список расширений gcc на C ++ ни в соответствующий список для лязг. Поэтому я бы сказал, что у вас нет гарантии, что это работает для любого компилятора.

0

Другие решения

Ничто не говорит о том, что это будет работать. От вас зависит, решите ли вы использовать его, чтобы убедиться, что он действительно работает для той архитектуры, в которой вы его используете. И важно учитывать тот факт, что генерация кода, отладочные ловушки для использования нулевого указателя (и тому подобное) и оптимизация во всех компиляторах «зависят от целевой системы» — так что это может хорошо работать на x86, но не на MIPS, как пример , Или он может перестать работать так или иначе в версии X + 0.0.1 компилятора.

Сказав это, я ожидаю, что этот конкретный пример будет отлично работать на любой архитектуре, потому что this нигде не используется.

Обратите внимание, что то, что что-то не определено, не обязательно означает, что оно будет аварийно завершаться, отказывать или даже «работать не так, как вы ожидаете». Тем не менее, он позволяет компилятору генерировать любой код, который ему нужен, включая что-то, что взрывает ваш компьютер, форматирует жесткий диск и т. Д., И т. Д.

0

По вопросам рекламы [email protected]