web-dev-qa-db-ja.com

ラムダが要求せずにキャプチャしたstd :: coutへのローカル参照

気を失いましたか?これは常に許可されましたか?

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

空のキャプチャ句[]は、ラムダ式の本体が外側のスコープの変数にアクセスしないことを示します。

さらなる調査によると、これは実際にconstのもの(私も知りませんでしたが、何でも)をキャプチャするのに問題はありませんが、osconstではありません(参照はありません) !それでもis不変...).

オンにすると私はこれに遭遇しました-WextraとClangが&osキャプチャ(実際のコードに含まれています)は不要です。それを削除すると、ビルドが機能することがわかりました。

ラムダ式による参照の暗黙的なキャプチャのケースをカバーするオープンな clangレポート があります。これはstd::coutに限定されず、定数式を参照することが判明している参照変数に限定されます。

詳細については、CWGのバッキング欠陥レポートは CWG-1472 です。

編集:

@ Rakete1111コメントに基づいて、clangがコードを受け入れるのは正しいことを明示的に指摘する必要がありました。これは、上記のCWGの欠陥を適用した結果です。レポートは、受け入れについて間違っていたのではなく、診断の場所のために再開されました。

23
Jans