У меня есть код, который выглядит следующим образом - это сильно упрощенная, но этот фрагмент компилирует и имеет такое же поведение:Может ли незахваченная переменная затеняться параметром лямбда?
template <typename TFunc>
float FloatSelect(const float in_value, TFunc&& Predicate) {
return std::forward<TFunc>(Predicate)(in_value) ? in_value : 0.0f;
};
void DisplayFloatSelect() {
const float value = FloatSelect(
-1.0f,
[] (const float value) { return value > 0.0f; }
);
std::cout << value << std::endl;
}
С -Wshadow включен компилятор выдает следующее предупреждение (как видно here):
12 : warning: declaration shadows a local variable [-Wshadow]
[] (const float value) { return value > 0.0f; }
^
10 : note: previous declaration is here
const float value = FloatSelect(
^
Это не очень полезно - я понимаю, что затеняет переменную, но поскольку лямбда ничего не захватывает, здесь должно быть хорошо.
Что мне не хватает?
Его полезно, потому что, возможно, вы хотели его захватить и нет (и вы не получаете [соответствующее сообщение об ошибке] (http://coliru.stacked-crooked.com/a/e2b67408a861b26d) из-за затенения) , – Borgleader
Ничего, предупреждение не имеет смысла. –
Вы использовали одно и то же имя переменной в двух вложенных контекстах, компилятор не знает, было ли это намеренно, поэтому оно дает предупреждение. Вот в чем смысл этого предупреждения. Оригинальное 'значение' находится в области тела лямбда, оно просто плохо сформировано, чтобы ссылаться на него, не захватывая его. –