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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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