Эталонный член класса Reference - PullRequest
2 голосов
/ 27 марта 2020

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

Clang и G CC согласны с тем, что класс тривиален, но MSV C не согласен. Кто прав и почему согласно стандарту?

#include <type_traits>

struct example {
    int& r;
};


// Clang and GCC let this pass
// MSVC fires this assertion
static_assert(
    std::is_trivial<example>::value,
    "example is not trivial"
);

1 Ответ

6 голосов
/ 27 марта 2020

Согласно C ++ 17 [class] / 6, для того чтобы класс был тривиальным, среди прочих требований, он должен иметь как минимум один не удаленный конструктор по умолчанию. Конструктор по умолчанию класса example удален, поэтому example не является тривиальным классом.

До C ++ 17 ситуация несколько менее ясна. Для тривиального класса требовалось иметь тривиальный конструктор по умолчанию, и было неясно, квалифицируется ли удаленный конструктор по умолчанию как тривиальный. Ричард Смит спросил в CWG 1928 , являются ли специальные функции-члены, которые по умолчанию и неявно удалены, тривиальными. Комитет ответил:

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

Впоследствии решение CWG 1496 решило эту проблему в случае тривиальной классы: больше не имеет значения, квалифицируется ли удаленный конструктор по умолчанию как тривиальный, потому что в C ++ 17 определение говорит, что все конструкторы по умолчанию (если их несколько) должны быть либо тривиальными, либо удалено и по крайней мере одно должно быть не удалено.

Кажется, что G CC и Clang, возможно, рассматривали удаленные конструкторы по умолчанию как тривиальные и не были обновлены с C ++ 17 определение понятия «тривиальный класс». Вы должны подавать сообщения об ошибках.

...