2

このコードはどうしてコンパイルされるのですか???

ライブコード

#include <iostream>


int main() {
    auto lambda1 = []{};
    auto lambda2 = []{};

    if(lambda1 && lambda2) {
        std::cout << "BOOLEAN LAMBDAS!!!" << std::endl;
    }

    if(lambda1 || lambda2) {
        std::cout << "BOOLEAN LAMBDAS AGAIN FTW!!!" << std::endl;
    }

    bool b1 = lambda1;
    bool b2 = lambda2;

    std::cout << b1 << ", " << b2 << std::endl;
}

ブールラムダ!(またはブーラムダス、できれば... *避けます*)

なぜこれが機能するのですか?これは別の GCC バグですか? そうでない場合、これは標準ですか?

4

1 に答える 1

7

それが標準であることがわかりました!

この回答[1]を参照すると、非キャプチャラムダは関数ポインターに変換可能です。boolそして、関数ポインター自体がポインターであるため、暗黙的に!に変換できることが再び判明しました。

4.12 ブール変換 [conv.bool]

1算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、bool 型の prvalue に変換できます。ゼロ値、NULL ポインター値、または NULL メンバー ポインター値は false に変換されます。その他の値は true に変換されます。std::nullptr_t 型の prvalue は bool 型の prvalue に変換できます。結果の値は false です。

関数ポインターへの変換がこれらすべてを実現するものであるという裏付けとなる証拠を示すために、ラムダのキャプチャーで同じことを試みました。次に、「に変換できませんbool」というエラーが生成されます。

ライブコード

int main() {
    int i;
    auto lambda = [i]{};

    bool b = lambda;

    if(lambda) {}
}

[1] 正直なところ、これは私にこれを書くアイデアを与えてくれました。

于 2013-09-19T08:40:59.487 に答える