Ослабление требований инициализации копирования в C++17
[...] Результат преобразования, который является выражением prvalue (начиная с C++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 ответ
В тех случаях, когда разрешение на копирование является обязательным в C++17, эти конструкторы никогда не используются. В этом случае нечего проверять.
В более ранних версиях, где elision был просто необязательным, проверки доступа требовались для получения согласованного результата между компиляторами. Все еще происходит в C++ 17 для случаев, когда исключение не является обязательным.