Информация об изменениях

Сообщение Как вернуть NonCopyable объект? от 24.12.2015 10:54

Изменено 24.12.2015 11:47 Basil2

описка

Есть код:

class MyClass : NonCopyable {}

MyClass foo()
{
    return MyClass();
}

Он прекрасно компилируется в MSVC 2010 и в Clang — видимо, срабатывает оптимизация возвращаемого значения и копирующий конструктор не требуется.

Однако код не компилируется в MSVC 2015 — пишет "referencing deleted function", указывая на копирующий конструктор. Конструкция
return MyClass{}
спасает ситуацию, но она в свою очередь не компилируется в MSVC 2010.

Вопрос — как красиво выйти из ситуации, чтобы код собирался одновременно под 2010, 2015 и clang?
Условную компиляцию и отказ от noncopyable не предлагать
Есть код:

class MyClass : NonCopyable {}

MyClass foo()
{
    return MyClass();
}

Он прекрасно компилируется в MSVC 2010 и в Clang — видимо, срабатывает оптимизация возвращаемого значения и копирующий конструктор не требуется.

Однако код не компилируется в MSVC 2015 — пишет "referencing deleted function", указывая на копирующий конструктор. Конструкция
return {};
спасает ситуацию, но она в свою очередь не компилируется в MSVC 2010.

Вопрос — как красиво выйти из ситуации, чтобы код собирался одновременно под 2010, 2015 и clang?
Условную компиляцию и отказ от noncopyable не предлагать