2

ラムダ関数に特化した記事ClosureType::operator ret(*)(params)()で、特にその. この記事では、オペレーターは「汎用のキャプチャレス ラムダ ユーザー定義変換関数テンプレート」と呼んでいました。

コードが与えられた場合 (適切な型の関数ポインターへの自動変換):

#include <iostream>
#include <cstdlib>

#if 0

template< typename L, typename R, typename ...A >
constexpr
auto 
to_function_pointer(L l, R (L::*)(A...) const)
{
    return static_cast< R (*)(A...) >(l);
}

template< typename L, typename R, typename ...A >
constexpr
auto 
to_function_pointer(L l, R (L::*)(A...))
{
    return static_cast< R (*)(A...) >(l);
}

template< typename L >
constexpr
auto 
to_function_pointer(L l)
{
    return to_function_pointer(l, &L::operator ());
}

#endif

template< typename R, typename ...A >
constexpr
auto
to_function_pointer(R (* fp)(A...))
{
    return fp;
}

namespace
{

void f() { std::cout << __PRETTY_FUNCTION__ << std::endl; }

}

int main()
{
    to_function_pointer(f)();
    to_function_pointer(&f)();
    to_function_pointer([] () { std::cout << __PRETTY_FUNCTION__ << std::endl; })();
    to_function_pointer([] () mutable { std::cout << __PRETTY_FUNCTION__ << std::endl; })();
    return EXIT_SUCCESS;
}

#if 0コードの関数の場合to_function_pointer、ラムダを対応する関数ポインターに変換できません。explicit言及された演算子がキーワードによって「暗黙的に」マークされているということですか? 規格に対応する条項はありますか?

4

0 に答える 0