Надлежащая поддержка летучих квалификаторов функций членов в STLC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Надлежащая поддержка летучих квалификаторов функций членов в STL

Сообщение Anonymous »

Неправильная поддержка volatile-квалифицированные перегрузки функций элементов в stl предотвращает использование контейнеров, интеллектуальных указателей и т. Д. В общем коде. Скажите, я хочу объявить класс обертки, который обеспечивает семантику ценности и допускает неполноту базового типа: < /p>

Код: Выделить всё

#include 
#include 
#include 

template< typename type >
struct recursive_wrapper
{

using value_type = type;

template< typename ...arguments >
recursive_wrapper(arguments &&... _arguments)
: storage_(std::make_unique< type >(std::forward< arguments >(_arguments)...))
{ ; }

operator type & () & noexcept
{
return *storage_;
}

operator type const & () const & noexcept
{
return *storage_;
}

operator type && () && noexcept
{
return std::move(*storage_);
}

operator type const && () const && noexcept
{
return std::move(*storage_);
}

operator volatile type & () volatile & noexcept
{
return *storage_;
}

operator volatile type const & () volatile const & noexcept
{
return *storage_;
}

operator volatile type && () volatile && noexcept
{
return std::move(*storage_);
}

operator volatile type const && () volatile const && noexcept
{
return std::move(*storage_);
}

private :

std::unique_ptr< type > storage_;

};

// file:main.cpp
#include 
#include 

#include 

int
main()
{
struct A;
struct B { recursive_wrapper< A > a; };
struct A { std::vector< B > b; };
{ // basic usage
B b;
A & a = b.a; // OK
static_cast< void >(a);
}
// let's add cv-qualifiers
{
volatile B b;
volatile A & a = b.a; // error!
static_cast< void >(a);
}
return EXIT_SUCCESS;
}
Отсутствие соответствующего volatile-квалифицированного перегрузка std :: unqie_ptr :: operator * () вызывает ошибку:

Код: Выделить всё

main.cpp:38:16: error: indirection requires pointer operand ('volatile std::unique_ptr' invalid)
return *storage_;
^~~~~~~~~
main.cpp:83:30: note: in instantiation of member function 'recursive_wrapper::operator volatile A &' requested here
volatile A & a = b.a;
^
Такая же история со std :: container :: push_back () , size () и т. д.
это полностью предотвращает использование stl в общем коде, который использует измененную Qualifer. решение? Почему емкость квалификатор функции членов не поддерживается в stl ? Является ли изменен квалификатор функции члена?

Подробнее здесь: https://stackoverflow.com/questions/329 ... ons-in-stl
Ответить

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

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

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

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

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