std::as_const
Материал из cppreference.com
Определено в заголовочном файле <utility> | ||
template<class T > constexprstd::add_const_t<T>& as_const( T& t )noexcept; | (1) | (начиная с C++17) |
template<class T > void as_const(const T&&)= delete; | (2) | (начиная с C++17) |
1) Формирует ссылку lvalue на константный тип t.
2) Перегрузка ссылки const rvalue удалена, чтобы запретить аргументы rvalue.
Содержание |
[править]Возможная реализация
template<class T>constexprstd::add_const_t<T>& as_const(T& t)noexcept{return t;} |
[править]Примечание
Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
---|---|---|---|
__cpp_lib_as_const | 201510L | (C++17) | std::as_const |
[править]Пример
Запустить этот код
#include <cassert>#include <string>#include <type_traits>#include <utility> int main(){std::string mutableString ="Привет Мир!";auto&& constRef = std::as_const(mutableString); mutableString.clear();// OK// constRef.clear(); // Ошибка: 'constRef' имеет квалификацию 'const',// а 'clear' не помечена как const assert(&constRef ==&mutableString );assert(&std::as_const( mutableString )==&mutableString ); using ExprType =std::remove_reference_t<decltype(std::as_const(mutableString))>; static_assert(std::is_same_v<std::remove_const_t<ExprType>, std::string>, "ExprType должен быть какой нибудь строкой"); static_assert(!std::is_same_v<ExprType, std::string>, "не должен быть mutable строкой.");}
[править]Смотрите также
(C++11) | проверяет, является ли тип квалифицированным как const (шаблон класса) |
(C++11)(C++11)(C++11) | добавляет спецификаторы const и/или volatile к данному типу (шаблон класса) |
(C++11)(C++11)(C++11) | удаляет спецификаторы const и/или volatile из данного типа (шаблон класса) |
преобразует view в constant_range (шаблон класса)(объект адаптера диапазона) |