Я сошел с ума? Это всегда было разрешено?
#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
Хотя и смотри по колиру
(живое демо)
Я всегда думал, что пустой захват ничего не захватит.
Действительно, MSDN говорит:
Пустое предложение захвата, [], указывает, что тело лямбда-выражения не обращается ни к каким переменным во внешней области видимости.
Дальнейшие исследования показывают, что на самом деле это нормально для захвата const
(что я тоже не знал, но что угодно), но os
не является const
(нет ссылки! Хотя она неизменна…).
Я столкнулся с этим при включении -Wextra
и заметил, что Clang считает, что захват &os
(который присутствует в моем реальном коде) не нужен. Удаляя его, я был поражен, обнаружив, что сборка работает.