Ослабление требований инициализации копирования в C ++ 17

Я смущен cppref заявления:

[…] Результат преобразования, который является prvalue выражение (так как
С ++ 17)
если был использован конструктор преобразования, то используется для
прямая инициализация объекта.
Последний шаг обычно оптимизируется, и результат
преобразование строится непосредственно в памяти, выделенной для
целевой объект, но соответствующий конструктор (переместить или скопировать)
должен быть доступен, даже если он не используется. (до C ++ 17)

Я проверял код std::atomic_int atom = 1; на GCC 8.0.1, и он компилируется с C ++ 17, но терпит неудачу с C ++ 14 со следующей ошибкой:

error: use of deleted function 'std::atomic<int>::atomic(const std::atomic<int>&)'
std::atomic_int atom = 1;
^

Означает ли это, что соответствующий конструктор (перемещение или копирование) (всегда?) Больше не должен быть доступен в C ++ 17?

-1

Решение

В случаях, когда копия elision является обязательный в C ++ 17 эти конструкторы никогда не используются. В этом случае нечего проверять.

В более ранних версиях, где elision был просто необязательным, проверки доступа требовались для получения согласованного результата между компиляторами. Все еще происходит в C ++ 17 для случаев, когда исключение не является обязательным.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector