Перед его воспроизведением должны быть выполнены некоторые определенные предварительные условия:
Код: Выделить всё
#include
/// Precondition #1: T must be a nested struct
struct Foo
{
struct Victim
{
/// Precondition #2: T must have an aggregate-initializer
/// for one of its members
std::size_t value{0};
};
/// Precondition #3: std::optional must be instantiated in this scope
std::optional victim;
bool foo()
{
std::optional foo;
// An error
foo.emplace();
/// Assertion is failed
static_assert(std::is_constructible::value);
}
};
Живой пример на godbolt.org
Измените любое из предварительных условий, и он скомпилируется, как ожидалось. Есть ли какое-то неизвестное несоответствие в стандарте, из-за которого clang отклоняет этот код, хотя он соответствует требованиям?
В качестве примечания: GCC 7.1 и GCC 7.2 не имеют проблем с приведенным выше кодом.
Отчет об ошибке: bugs.llvm.org>
Подробнее здесь: https://stackoverflow.com/questions/479 ... t-of-the-p
Мобильная версия