Локальная ссылка на std :: cout, захваченная лямбдой без запроса - PullRequest
0 голосов
/ 21 ноября 2018

Я сошел с ума?Было ли это всегда разрешено?

#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:

( live demo )

Я всегда думал, что пустой захват ничего не захватит.

Действительно, MSDN говорит :

Пустое предложение захвата, [], указывает, что тело лямбда-выражения не имеет доступа к переменным в охватывающей области видимости..

Дальнейшие исследования показывают, что это действительно нормально для захвата const вещей (которые я тоже не знал, но что угодно), но os не const (нет ссылкиесть! хотя он является неизменным…).

Я столкнулся с этим при включении -Wextra и заметил, что Кланг подумал о захвате &os (который присутствует в моем реальном коде)было ненужным.Удаляя его, я был поражен, обнаружив, что сборка работает.

1 Ответ

0 голосов
/ 21 ноября 2018

Существует открытый отчет о лягушке , который охватывает случай неявного захвата ссылок лямбда-выражениями, это не ограничивается std::cout, но переменной переменной, которая, как находят, ссылается на константные выражения.

Для получения дополнительной информации отчет о дефектах подложки на CWG имеет вид CWG-1472

РЕДАКТИРОВАТЬ:

Основано на комментарии @ Rakete1111Я должен был четко указать, что clang прав в принятии кода, который является результатом применения дефекта CWG, упомянутого выше.Отчет был вновь открыт из-за местоположения диагноза, а не из-за неправильного принятия

...