#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.
Есть ли какая-либо гарантия, что эти два компилятора позволят это как функцию / спецификацию / расширение компилятора?
Я не могу найти это ни в список расширений gcc на C ++ ни в соответствующий список для лязг. Поэтому я бы сказал, что у вас нет гарантии, что это работает для любого компилятора.
Ничто не говорит о том, что это будет работать. От вас зависит, решите ли вы использовать его, чтобы убедиться, что он действительно работает для той архитектуры, в которой вы его используете. И важно учитывать тот факт, что генерация кода, отладочные ловушки для использования нулевого указателя (и тому подобное) и оптимизация во всех компиляторах «зависят от целевой системы» — так что это может хорошо работать на x86, но не на MIPS, как пример , Или он может перестать работать так или иначе в версии X + 0.0.1 компилятора.
Сказав это, я ожидаю, что этот конкретный пример будет отлично работать на любой архитектуре, потому что this
нигде не используется.
Обратите внимание, что то, что что-то не определено, не обязательно означает, что оно будет аварийно завершаться, отказывать или даже «работать не так, как вы ожидаете». Тем не менее, он позволяет компилятору генерировать любой код, который ему нужен, включая что-то, что взрывает ваш компьютер, форматирует жесткий диск и т. Д., И т. Д.