Это неопределенное поведение для разыменования nullptr, как это?

#include <iostream>

struct A
{
    int arr[666];
};

int main()
{
    std::cout<<sizeof( (static_cast<A*>(nullptr))->arr); //OK?
}

Приведенный выше код может быть запущен без ошибок. Говорит ли стандарт что-нибудь о такой ситуации?


person scottxiao    schedule 05.05.2019    source источник
comment
@ πάντα - это невычисленный операнд. Ни один из ответов в обмане не касается этого.   -  person StoryTeller - Unslander Monica    schedule 05.05.2019
comment
@StoryTeller Добавлена ​​еще одна ссылка со стандартными цитатами. Не стесняйтесь добавлять лучшие или повторно открывать вопрос.   -  person πάντα ῥεῖ    schedule 05.05.2019
comment
@πάνταῥεῖ не могли бы вы предоставить предыдущую ссылку в комментарии? Я тоже хочу это увидеть.   -  person scottxiao    schedule 05.05.2019
comment
@ πάνταῥεῖ Но я действительно видел только одну ссылку.   -  person scottxiao    schedule 05.05.2019
comment
@bigxiao К сожалению, кто-то, должно быть, удалил оригинал. Был не я.   -  person πάντα ῥεῖ    schedule 05.05.2019
comment
@πάνταῥεῖ Ну, я был бы признателен, если бы вы снова предоставили эту ссылку в комментарии. Я не мог найти этот вопрос.   -  person scottxiao    schedule 05.05.2019
comment
@bigxiao Это было вот это: stackoverflow.com/questions/6793262/   -  person πάντα ῥεῖ    schedule 05.05.2019
comment
Из того, что я вижу, другой поток не имел отношения к доступу к членам, поэтому здесь может быть полезный другой ответ. Начиная с С++ 17, по-видимому, вы должны делать это: struct A { int arr[666]; }; std::cout << sizeof(A().arr);. См. en.cppreference.com/w/cpp/language/. Существует также способ C, который существует немного дольше и, судя по тому, как он выглядит на cppreference, в любом случае делает то же самое (объявляет временный объект, а затем исключает его как неиспользуемый): std::cout << sizeof( ((struct S) { }).a )   -  person l.k    schedule 05.05.2019