Std::optional операторы присваиванияC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Std::optional операторы присваивания

Сообщение Anonymous »

Я имею в виду параметры (4), (5) и (6) std::optional::operator=.
Учитывая, что

Шаблон класса 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.
Из вышесказанного следует, что U не является std::optional, но поскольку std::optional может быть 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
Ответить

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

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

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

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

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