/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
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
Выберите страницу свойств>конфигурации C/C++>Language.
Задайте для свойства "Принудительное преобразование типов" значение
/Zc:rvalueCast
или/Zc:rvalueCast-
. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по