Построение constexpr std:: слабый ptr


Согласно документации std::weak_ptr можно построить constexpr weak_ptr:

#include <memory>
constexpr weak_ptr<int> foo{};

Однако попытка сделать это с помощью clang приводит к ошибке компиляции, жалующейся на то, что переменная constexpr не может иметь нелитеральный Тип 'const std::weak_ptr<int>', что связано с тем, что weak_ptr<int> имеет пользовательский деструктор. (что и делает, глядя на заголовки libc++)

Мой вопрос в том, является ли это ошибкой libc++, илиconstexpr weak_ptr просто не имеет смысла и наличие конструктора constexpr по умолчанию является ошибкой? Могу ли я ожидать этого чтобы работать в будущем?

1 4

1 ответ:

Это ошибка libc++

Нет.

Do constexpr weak_ptr просто не имеет смысла

Да.

Наличие конструктора constexpr по умолчанию является ошибкой?

Нет. Конструктор constexpr, используемый для не-литерального типа, разрешает постоянную инициализацию для статических переменных и переменных длительности хранения потока, которая выполняется до любой динамической инициализации.

Это означает, например, что глобальный дефолт-сконструированный weak_ptr объект всегда инициализируется и может безопасно использоваться в конструкторах глобальных объектов.

// TU 1
namespace foo {
   std::weak_ptr<int> meow;
}

// TU 2
namespace foo {
   extern std::weak_ptr<int> meow;
}

struct C {
    C() { /* can safely use foo::meow here */ }
} c;

Могу ли я ожидать этого [constexpr weak_ptr] чтобы работать в будущем?

Нет.