18
#include <cassert>
#include <cmath>

int main()
{
    struct point_of_cone
    {
        double x, y;
        double z = [&] { using std::sqrt; return sqrt(x * x + y * y); }();
    };
    point_of_cone p = {3.0, 4.0};
    assert(p.z == 5.0);
}

トランクからの場合は正常に動作しますclang++が、g++トランクからの場合はエラー メッセージ ( link )で失敗します。

エラー: 'this' は、このラムダ関数に対してキャプチャされませんでした

point_of_cone名前空間スコープでの定義は、両方で正常に機能します。

ラムダ キャプチャを使用してわずかに変更された定義[this]は、グローバル スコープまたはローカル スコープの両方でも正常に機能します。

どのコンパイラが正しいですか?

4

1 に答える 1

11

それは gcc のバグです。

int main() {
    struct A {
        int x, i = [&] { return x; }();
    } a{0};
}

これは失敗しますが、もし…</p>

  • &thisまたは_
  • A名前空間スコープを持つと宣言し、

できます。ただし、これらのいずれも整形式に影響を与えるべきではありません。

報告: #78019 .

于 2016-10-18T11:24:03.120 に答える