Учитывая, что
Шаблон класса std::optional управляет необязательным содержащимся значением, то есть значением, которое может присутствовать или отсутствовать.
(4) из ссылки в описании указано:
Функция не участвует в разрешении перегрузки, если только std::decay_t (до C++20)std::remove_cvref_t (поскольку C++20) не является std::optional, std::is_constructible_v имеет значение true, std::is_assignable_v имеет значение true, и хотя бы одно из следующих условий истинно:
- T не является скалярным типом;
- std::decay_t не является T.
std::is_constructible_v истинно, std::is_assignable_v истинно
Кроме того, если T не является скалярным типом, как может работать присвоение, если std::decay_t не является T?
(5) и (6) указывают:
Эти перегрузки не участвуют в разрешении перегрузки, если не выполняются следующие условия:
- T не является конструируемым, конвертируемым или присваиваемым из любого выражения типа (возможно, const) std::optional, т.е.
- все следующие 12 признаков типа являются ложными:
std::is_constructible_v - std::is_constructible_v
- std::is_constructible_v
- std::is_constructible_v
- std::is_convertible_v
- std::is_convertible_v
- std::is_convertible_v
- std::is_convertible_v
- std::is_assignable_v
- std::is_assignable_v
- std::is_assignable_v
- std::is_assignable_v
Опять же, std::optional может быть U, и если да, то как работает присвоение?
Далее в описании говорится:
Для перегрузки (5), std::is_constructible_v и std::is_assignable_v оба верны.
Для перегрузки (6) std::is_constructible_v и std::is_assignable_v оба верны.
Разве это не было бы так, если бы std::optional содержал U?
Должно ли считать, что std::optional и std::optional не имеют допустимых значений для разрешения вышеуказанных очевидных противоречий?
На основании приведенного ниже тестового кода, std::optional и T — это разные типы.
#include
#include
#include
#include
#include
using std::optional;
using std::is_same;
using std::string;
using std::boolalpha;
using std::cout;
using std::endl;
int main (){
optional opt("yes");
string s("yeah");
cout
Подробнее здесь: https://stackoverflow.com/questions/771 ... -operators
Мобильная версия