Построение 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
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
] чтобы работать в будущем?Нет.