Построение 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 ответ:
Это ошибка libc++
Нет.
Do
constexprweak_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;Могу ли я ожидать этого [
constexprweak_ptr] чтобы работать в будущем?Нет.