Когда тройной оператор подходит для копирования Elision?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Когда тройной оператор подходит для копирования Elision?

Сообщение Anonymous »

Согласно
этой статье
Raymond Chen, выражение Ternary не является кандидатом на копию Elision. < /p>

Проблема с тщательным Правило для тройных выражений заключается в том, что
Результат инициализируется из < /em> ветви выбранного тройного. Сделал еще несколько тестирования: < /p>
Следующий код, измененный из блога
raymond Chen,
действительно отвергается всеми тремя компиляторами: < /p>

Код: Выделить всё

#include
#include
#include
struct WidgetBase
{
// local mode
WidgetBase() {};

// remote mode
WidgetBase(std::string const& server)
:m_server(server)
{
std::cout 
Godbolt < /p>
Clang: error: call to implicitly-deleted copy constructor of 'WidgetBase' note: copy constructor of 'WidgetBase' is implicitly
MSVC: error C2280: 'WidgetBase::WidgetBase(const WidgetBase &)': attempting to reference a deleted function
deleted because field 'm_mutex' has a deleted copy constructor
gcc: error: use of deleted function 'std::mutex::mutex(const std::mutex&)'
< /code>
Тем не менее, GCC и Clang принимают следующий код, но MSVC не: < /p>
struct Widget2
{
WidgetBase m_wb;
Widget2(WidgetOptions const& options) :
m_wb(
options.CanBeLocal
? WidgetBase()
: WidgetBase(options.server))
{
}
};

int main() {
WidgetOptions options{ false ,"123" };
[[maybe_unused]] WidgetBase wb1 =
options.CanBeLocal
? WidgetBase()
: WidgetBase(options.server);
options.server = "456";
[[maybe_unused]] WidgetBase wb2(
options.CanBeLocal
? WidgetBase()
: WidgetBase(options.server));
}
< /code>
Godbolt < /p>
If I add a move constructor to WidgetBase
(So Widget может быть скомпилирован), Clang и MSVC фактически вызовут его в конструкторе Widget , но GCC не будет; Часть, которую MSVC изначально не смогла скомпилировать, станет дополнительным вызовом конструктора движения. < /p>
Godbolt < /p>
Есть еще одна особенно странная вещь: элемент struct, кажется, влияет на MSVC Elision или нет! class = "lang-cpp prettyprint-override">struct WidgetBase
{
// local mode
WidgetBase() {};

// remote mode
WidgetBase(std::string const& server)
//removed :m_server(server)
{
std::cout
Итак, когда стандарт разрешает копию Elision для тройного оператора? Когда можно определить, что копия не существует?


Подробнее здесь: https://stackoverflow.com/questions/797 ... py-elision
Ответить

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

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

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

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

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