8

推論された戻り値の型が std::nullptr_t の場合、2 番目の代入が許可されるのはなぜですか? 関数ポインターでは、これは禁止されています。

2番目のラムダが実行されないのはなぜですか?

#include <cstdio>
#include <functional>

int main()
{
    std::function<void* ()> f;

    f = []() -> void* {
        printf ("runs\n");
        return nullptr;
    };
    f();

    f = []() {
        printf ("doesn't run\n");
        return nullptr; // -> std::nullptr_t
    };
    f();

    return 0;
}
4

1 に答える 1

11

std::function提供した署名が次の条件を満たしている限り、何でも保存できます。

  • すべての引数の型は、格納された呼び出し可能なエンティティの引数の型に暗黙的に変換可能であり、
  • 格納された呼び出し可能なエンティティの戻り値の型は、署名の戻り値の型に暗黙的に変換可能です

std::nullptr_t任意のポインター型に暗黙的に変換可能であり、そのポインター型の null ポインター値を生成します。

コードは実際には有効な C++11 ではないことに注意してください。これはreturn expr;、2 番目のラムダに a しかないため、戻り値の型の推定は行われないためです。GCC (および Clang、IIRC) は、これを拡張機能として実装しています。これは、いずれ標準の一部になる予定だからです。

于 2012-11-03T19:26:51.007 に答える