2016-06-16 10 views
4

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

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

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

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

+0

Деструктора 'weak_ptr' отвечает за открепление (от' shared_ptr' блока управления, который является то, что 'weak_ptr' висит на), так что я не думаю, что это может быть 'constexpr'. –

+0

Просьба ссылаться на документацию, на которую вы ссылаетесь, или ссылаться на нее. –

+0

Я вижу в C++ 14 (окончательный проект N3290), что конструктор по умолчанию - 'constexpr'. Это меня озадачивает. –

ответ

7

является ли это LibC++ ошибка

No.

ли constexprweak_ptr просто не имеет смысла

Да.

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

№ А constexpr Конструктор используется на небуквальный типе позволяет constant initialization для статической и хранения переменной нити длительности, которая имеет место перед любой динамической инициализацией.

Это означает, например, что глобальный построенный по умолчанию объект 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], чтобы работать в будущем?

No.

+0

Я не вижу отчета об ошибке. Вы знаете обоснование для 'constexpr' в конструкторе по умолчанию? –

+1

@ Cheersandhth.-Alf Как я уже сказал, он допускает постоянную инициализацию. –

+0

Да, но, как я уже сказал, вы знаете обоснование? –

 Смежные вопросы

  • Нет связанных вопросов^_^