Clang 5: std::optional винты создания экземпляра std::is_constructible признак ошибки типа параметра нет функции-члена eC++

Программы на C++. Форум разработчиков
Anonymous
Clang 5: std::optional винты создания экземпляра std::is_constructible признак ошибки типа параметра нет функции-члена e

Сообщение Anonymous »

Действительно странное и неожиданное поведение clang 5 было обнаружено при переходе на c++17 и замене специального решения std::optional на стандартное. По какой-то причине emplace() был отключен из-за ошибочной оценки признака std::is_constructible класса параметров.

Перед его воспроизведением должны быть выполнены некоторые определенные предварительные условия:

Код: Выделить всё

#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

Вернуться в «C++»