/Zc:rvalueCast (принудительное применение правил преобразования типов)

/Zc:rvalueCast При указании параметра компилятор правильно идентифицирует ссылочный тип rvalue в результате операции приведения. Его поведение соответствует стандарту C++11. Если параметр не указан, поведение компилятора совпадает с поведением в Visual Studio 2012.

Синтаксис

/Zc:rvalueCast
/Zc:rvalueCast-

Замечания

Если /Zc:rvalueCast задано, компилятор следует разделу 5.4 стандарта C++11 и обрабатывает только выражения приведения, которые приводят к неконференционным типам и выражениям приведения, которые приводят к ссылкам rvalue на типы, не являющиеся функциями, как типы rvalue. По умолчанию или /Zc:rvalueCast- если задано, компилятор не соответствует требованиям и обрабатывает все выражения приведения, которые приводят к ссылкам на rvalue как rvalue. Для соответствия требованиям и устранения ошибок при использовании приведения рекомендуется использовать /Zc:rvalueCast.

По умолчанию /Zc:rvalueCast отключен (/Zc:rvalueCast-). Параметр /permissive-компилятор неявно задает этот параметр, но его можно переопределить с помощью /Zc:rvalueCast-.

Используйте /Zc:rvalueCast , если передать выражение приведения в качестве аргумента функции, которая принимает ссылочный тип rvalue. Поведение по умолчанию приводит к ошибке компилятора C2664 , если компилятор неправильно определяет тип выражения приведения. В этом примере показана ошибка компилятора в правильном коде, если /Zc:rvalueCast не указано:

// Test of /Zc:rvalueCast
// compile by using:
// cl /c /Zc:rvalueCast- make_thing.cpp
// cl /c /Zc:rvalueCast make_thing.cpp

#include <utility>

template <typename T>
struct Thing {
   // Construct a Thing by using two rvalue reference parameters
   Thing(T&& t1, T&& t2)
      : thing1(t1), thing2(t2) {}

   T& thing1;
   T& thing2;
};

// Create a Thing, using move semantics if possible
template <typename T>
Thing<T> make_thing(T&& t1, T&& t2)
{
   return (Thing<T>(std::forward<T>(t1), std::forward<T>(t2)));
}

struct Test1 {
   long a;
   long b;

   Thing<long> test() {
      // Use identity casts to create rvalues as arguments
      return make_thing(static_cast<long>(a), static_cast<long>(b));
   }
};

По умолчанию компилятор может не сообщать об ошибке C2102, когда это необходимо. В этом примере компилятор не сообщает об ошибке, если адрес rvalue, созданный приведением удостоверений, принимается, когда /Zc:rvalueCast не указано:

int main() {
   int a = 1;
   int *p = &a;   // Okay, take address of lvalue
                  // Identity cast creates rvalue from lvalue;
   p = &(int)a;   // problem: should cause C2102: '&' requires l-value
}

Дополнительные сведения о вопросах соответствия в Visual C++ см. в статье Nonstandard Behavior.

Установка данного параметра компилятора в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Выберите страницу свойств>конфигурации C/C++>Language.

  3. Задайте для свойства "Принудительное преобразование типов" значение /Zc:rvalueCast или /Zc:rvalueCast-. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.

См. также

/Zc (соответствие)