Я сошел с ума?Было ли это всегда разрешено?
#include <iostream>
int main()
{
auto& os = std::cout;
auto write = []()
{
os << "what\n";
};
write();
}
Я использую:
Apple LLVM версия 10.0.0 (clang-1000.10.44.4)
Цель: x86_64-apple-darwin17.7.0
Хотя также смотрите на Coliru:
Я всегда думал, что пустой захват ничего не захватит.
Действительно, MSDN говорит :
Пустое предложение захвата, [], указывает, что тело лямбда-выражения не имеет доступа к переменным в охватывающей области видимости..
Дальнейшие исследования показывают, что это действительно нормально для захвата const
вещей (которые я тоже не знал, но что угодно), но os
не const
(нет ссылкиесть! хотя он является неизменным…).
Я столкнулся с этим при включении -Wextra
и заметил, что Кланг подумал о захвате &os
(который присутствует в моем реальном коде)было ненужным.Удаляя его, я был поражен, обнаружив, что сборка работает.